Files
ocr_data/scripts/benchmark.sh
2026-09-28 16:09:31 +08:00

109 lines
4.5 KiB
Bash

#!/usr/bin/env bash
# 新机器上线前的算力/IO摸底测试(跟 scripts/diag.sh 不是一回事 —— diag.sh 是排查"已经在跑但
# 出问题"的机器;这个是给"还没开始跑正式任务、想先估算这台机器大概能跑多快"的新机器用的)。
# 测: CPU/内存/GPU(含真实硬解测试)/磁盘顺序读写速度/到OCR端点的网络延迟, 汇总成一份文件。
#
# 用法(项目根目录): bash scripts/benchmark.sh
# 产物: benchmark_YYYYmmdd_HHMMSS.txt (把这个文件发回来)
cd "$(cd "$(dirname "${BASH_SOURCE[0]}")/.." && pwd)" || exit 1
OUT="benchmark_$(date +%Y%m%d_%H%M%S).txt"
PY="$(command -v python || command -v python3)"
FFMPEG="$($PY -c "from config.config_utils import get_ffmpeg; print(get_ffmpeg())" 2>/dev/null || command -v ffmpeg)"
exec > >(tee "$OUT") 2>&1
echo "================ 算力/IO摸底 $(date) ================"
echo "主机: $(hostname)"
echo ""
echo "========== 1. CPU =========="
echo "[核数] $(nproc)"
if command -v lscpu >/dev/null 2>&1; then
lscpu | grep -E "Model name|CPU\(s\)|MHz|Thread|Socket"
fi
echo ""
echo "========== 2. 内存 =========="
free -h
echo ""
echo "========== 3. GPU =========="
if command -v nvidia-smi >/dev/null 2>&1; then
echo "[列表]"
nvidia-smi --query-gpu=index,name,memory.total,memory.used,utilization.gpu,driver_version --format=csv
echo ""
echo "[真实硬解测试: ffmpeg合成测试图案, 用CPU软编码生成素材(不碰GPU), 再用 -hwaccel cuda 解码,"
echo " 每张卡各测一遍 —— 生产流程只用GPU【解码】下载好的视频, 从不用GPU编码, 所以这里故意不测nvenc编码,"
echo " 只测跟生产完全一致的硬解路径]"
if [ -x "$FFMPEG" ] || command -v "$FFMPEG" >/dev/null 2>&1; then
n_gpu=$(nvidia-smi --query-gpu=index --format=csv,noheader | wc -l)
testfile="/tmp/_bench_src.mp4"
"$FFMPEG" -hide_banner -loglevel error -f lavfi -i "testsrc=size=1920x1080:rate=30:duration=10" \
-c:v libx264 -preset veryfast -f mp4 "$testfile" -y 2>&1 | tail -3
if [ -f "$testfile" ]; then
for dev in $(seq 0 $((n_gpu - 1))); do
echo " -- GPU $dev --"
t0=$(date +%s.%N)
"$FFMPEG" -hide_banner -loglevel error -hwaccel cuda -hwaccel_device "$dev" \
-i "$testfile" -f null - 2>&1 | tail -5
t1=$(date +%s.%N)
echo " 硬解读回耗时: $(echo "$t1 - $t0" | bc 2>/dev/null || echo "?")s (10秒素材, 越接近0越好, 明显>10s说明硬解没吃上或GPU很忙; 有报错说明硬解不可用, 会自动回退CPU软解)"
done
rm -f "$testfile"
else
echo " CPU软编码生成测试素材都失败了(跟GPU无关, 检查ffmpeg本身/libx264), 跳过硬解测试"
fi
else
echo " 找不到 ffmpeg, 跳过硬解测试"
fi
else
echo " 没有 nvidia-smi(不是GPU机器, 或驱动没装)"
fi
echo ""
echo "========== 4. 磁盘顺序读写速度(当前目录所在盘) =========="
TESTFILE="./_bench_io.tmp"
echo "[写] 顺序写1GB"
sync
dd if=/dev/zero of="$TESTFILE" bs=1M count=1024 conv=fdatasync 2>&1 | tail -3
echo "[读] 顺序读(先清缓存再读更准, 没权限清缓存就直接读)"
( sync && echo 3 > /proc/sys/vm/drop_caches ) 2>/dev/null
dd if="$TESTFILE" of=/dev/null bs=1M 2>&1 | tail -3
rm -f "$TESTFILE"
echo ""
echo "[磁盘剩余空间]"
df -h .
echo ""
echo "========== 5. 网络: 到OCR端点的延迟/连通率 =========="
if [ -f config/config.json ] && [ -n "$PY" ]; then
"$PY" tools/查端点存活.py --tcp --timeout 3 2>&1
else
echo " 跳过(找不到 python 或 config/config.json)"
fi
echo ""
echo "========== 6. 网络: 到COS的连通性 =========="
if command -v coscli >/dev/null 2>&1 || [ -x ./coscli-linux-amd64 ]; then
COSCLI="$(command -v coscli || echo ./coscli-linux-amd64)"
COSCFG="$($PY -c "from config.config_utils import config;print((config.get_splitframe_config() or {}).get('cosconfig_path','.cos.yaml'))" 2>/dev/null || echo .cos.yaml)"
JOBS_ROOT="$($PY -c "from config.config_utils import config;print((config.get_dispatch_config() or {}).get('jobs_root',''))" 2>/dev/null)"
if [ -n "$JOBS_ROOT" ]; then
echo "[列 $JOBS_ROOT 耗时]"
t0=$(date +%s.%N)
"$COSCLI" -c "$COSCFG" ls "$JOBS_ROOT/" 2>&1 | tail -5
t1=$(date +%s.%N)
echo " 耗时: $(echo "$t1 - $t0" | bc 2>/dev/null || echo "?")s (纯网络往返延迟参考, 不是下载带宽)"
else
echo " dispatch.jobs_root 未配置, 跳过"
fi
else
echo " 找不到 coscli, 跳过"
fi
echo ""
echo "================ 摸底结束 ================"
echo ""
echo ">>> 报告已保存到: $OUT (把这个文件发回来)"