首次提交
This commit is contained in:
108
scripts/benchmark.sh
Normal file
108
scripts/benchmark.sh
Normal file
@@ -0,0 +1,108 @@
|
||||
#!/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 (把这个文件发回来)"
|
||||
Reference in New Issue
Block a user