我使用300I DUO硬件加速FFmpeg视频编解码,在进行压力测试的时候,达不到产品手册中的256@1080P这么高的并发,在80路并发的时候就会产生Segmentation fault的报错,但是在npu-smi info中内存最高只有3000/44280,还有很大剩余,segmentation fault算报错吗?。测试脚本、截图如下:

```
#!/bin/bash
# ==============================================
# Ascend NPU 多路解码+编码 顺序压力测试(自动并发清理文件)
# 每一路复制视频文件,然后并行解码+并行编码
# 测试完删除生成的中间文件
# ==============================================
INPUT_FILE=${1:-input.mp4}
MAX_CONCURRENCY=${2:-12} # 最大并发路数,可修改
TEST_DURATION=30 # 每轮运行时长(秒)
WORKDIR="/workspace/video"
LOG_DIR="$WORKDIR/stress_logs"
SUMMARY_CSV="$LOG_DIR/summary.csv"
FFMPEG="/usr/local/ffmpeg-ascend/bin/ffmpeg"
mkdir -p "$LOG_DIR"
echo "stage,concurrency,avg_fps,avg_speed,errors" > "$SUMMARY_CSV"
echo "========================================="
echo "NPU 解码 + 编码 顺序压力测试"
echo "输入文件: $INPUT_FILE"
echo "最大并发: $MAX_CONCURRENCY"
echo "测试时长: ${TEST_DURATION}s"
echo "日志目录: $LOG_DIR"
echo "========================================="
# -------------------------
# 解析 ffmpeg 日志,计算平均 FPS 和 speed
# -------------------------
parse_ffmpeg_logs() {
local log_dir=$1
local stage=$2
local concurrency=$3
local total_fps=0
local total_speed=0
local count=0
local errors=0
for log in "$log_dir"/*.log; do
fps=$(grep -oE "fps=[0-9]+(\.[0-9]+)?" "$log" | tail -1 | sed 's/fps=//')
speed=$(grep -oE "speed=[0-9]+(\.[0-9]+)?x" "$log" | tail -1 | sed 's/speed=//;s/x//')
[[ -z "$fps" ]] && fps=0
[[ -z "$speed" ]] && speed=0
err=$(grep -ci "error" "$log")
total_fps=$(echo "$total_fps + $fps" | bc)
total_speed=$(echo "$total_speed + $speed" | bc)
errors=$((errors + err))
count=$((count + 1))
done
if [[ $count -gt 0 ]]; then
avg_fps=$(printf "%.0f" "$(echo "scale=2; $total_fps / $count" | bc)")
avg_speed=$(printf "%.2f" "$(echo "scale=2; $total_speed / $count" | bc)")
else
avg_fps=0
avg_speed=0
fi
echo "$stage 并发 $concurrency 路结果: 平均FPS=${avg_fps}, 平均速度=${avg_speed}x, 错误=${errors}"
echo "$stage,$concurrency,$avg_fps,$avg_speed,$errors" >> "$SUMMARY_CSV"
}
# -------------------------
# 主循环:自动化并发测试
# -------------------------
for ((k=1; k<=MAX_CONCURRENCY; k++)); do
echo
echo "#########################################"
echo ">>> 测试 ${k} 路并行 <<<"
echo "#########################################"
TEST_LOG_DIR="$LOG_DIR/test_${k}"
mkdir -p "$TEST_LOG_DIR"
# --- 复制视频文件 k 份 ---
for ((i=1; i<=k; i++)); do
cp "$WORKDIR/$INPUT_FILE" "$WORKDIR/input_${i}.mp4"
done
# --- 阶段 1: 并行解码 ---
echo "--- 阶段 1: $k 路并行解码 ---"
for ((i=1; i<=k; i++)); do
$FFMPEG -nostdin -y -hide_banner \
-c:v h264_ascend \
-i "$WORKDIR/input_${i}.mp4" \
-pix_fmt nv12 \
-f rawvideo "$WORKDIR/decoded_npu_720p30_${i}.yuv" \
> "$TEST_LOG_DIR/decode_${i}.log" 2>&1 &
done
echo "等待 $TEST_DURATION 秒运行..."
sleep $TEST_DURATION
echo "停止解码进程..."
pkill -P $$ ffmpeg 2>/dev/null
parse_ffmpeg_logs "$TEST_LOG_DIR" "解码" "$k"
# --- 阶段 2: 并行编码 ---
echo "--- 阶段 2: $k 路并行编码 ---"
for ((i=1; i<=k; i++)); do
$FFMPEG -nostdin -y -hide_banner \
-f rawvideo -pix_fmt nv12 -s 1280x720 -r 30 \
-i "$WORKDIR/decoded_npu_720p30_${i}.yuv" \
-c:v h265_ascend -b:v 2M -maxrate 2M -minrate 2M -bufsize 4M -g 60 \
-an "$WORKDIR/encoded_npu_720p30_${i}.mp4" \
> "$TEST_LOG_DIR/encode_${i}.log" 2>&1 &
done
echo "等待 $TEST_DURATION 秒运行..."
sleep $TEST_DURATION
echo "停止编码进程..."
pkill -P $$ ffmpeg 2>/dev/null
parse_ffmpeg_logs "$TEST_LOG_DIR" "编码" "$k"
# --- 清理测试文件 ---
echo "--- 清理测试文件 ---"
for ((i=1; i<=k; i++)); do
rm -f "$WORKDIR/input_${i}.mp4" \
"$WORKDIR/decoded_npu_720p30_${i}.yuv" \
"$WORKDIR/encoded_npu_720p30_${i}.mp4"
done
done
echo
echo "=== ✅ 所有测试完成 ==="
echo "汇总结果保存在: $SUMMARY_CSV"
```
我使用300I DUO硬件加速FFmpeg视频编解码,在进行压力测试的时候,达不到产品手册中的256@1080P这么高的并发,在80路并发的时候就会产生Segmentation fault的报错,但是在npu-smi info中内存最高只有3000/44280,还有很大剩余,segmentation fault算报错吗?。测试脚本、截图如下:
```
#!/bin/bash
# ==============================================
# Ascend NPU 多路解码+编码 顺序压力测试(自动并发清理文件)
# 每一路复制视频文件,然后并行解码+并行编码
# 测试完删除生成的中间文件
# ==============================================
INPUT_FILE=${1:-input.mp4}
MAX_CONCURRENCY=${2:-12} # 最大并发路数,可修改
TEST_DURATION=30 # 每轮运行时长(秒)
WORKDIR="/workspace/video"
LOG_DIR="$WORKDIR/stress_logs"
SUMMARY_CSV="$LOG_DIR/summary.csv"
FFMPEG="/usr/local/ffmpeg-ascend/bin/ffmpeg"
mkdir -p "$LOG_DIR"
echo "stage,concurrency,avg_fps,avg_speed,errors" > "$SUMMARY_CSV"
echo "========================================="
echo "NPU 解码 + 编码 顺序压力测试"
echo "输入文件: $INPUT_FILE"
echo "最大并发: $MAX_CONCURRENCY"
echo "测试时长: ${TEST_DURATION}s"
echo "日志目录: $LOG_DIR"
echo "========================================="
# -------------------------
# 解析 ffmpeg 日志,计算平均 FPS 和 speed
# -------------------------
parse_ffmpeg_logs() {
local log_dir=$1
local stage=$2
local concurrency=$3
local total_fps=0
local total_speed=0
local count=0
local errors=0
for log in "$log_dir"/*.log; do
fps=$(grep -oE "fps=[0-9]+(\.[0-9]+)?" "$log" | tail -1 | sed 's/fps=//')
speed=$(grep -oE "speed=[0-9]+(\.[0-9]+)?x" "$log" | tail -1 | sed 's/speed=//;s/x//')
[[ -z "$fps" ]] && fps=0
[[ -z "$speed" ]] && speed=0
err=$(grep -ci "error" "$log")
total_fps=$(echo "$total_fps + $fps" | bc)
total_speed=$(echo "$total_speed + $speed" | bc)
errors=$((errors + err))
count=$((count + 1))
done
if [[ $count -gt 0 ]]; then
avg_fps=$(printf "%.0f" "$(echo "scale=2; $total_fps / $count" | bc)")
avg_speed=$(printf "%.2f" "$(echo "scale=2; $total_speed / $count" | bc)")
else
avg_fps=0
avg_speed=0
fi
echo "$stage 并发 $concurrency 路结果: 平均FPS=${avg_fps}, 平均速度=${avg_speed}x, 错误=${errors}"
echo "$stage,$concurrency,$avg_fps,$avg_speed,$errors" >> "$SUMMARY_CSV"
}
# -------------------------
# 主循环:自动化并发测试
# -------------------------
for ((k=1; k<=MAX_CONCURRENCY; k++)); do
echo
echo "#########################################"
echo ">>> 测试 ${k} 路并行 <<<"
echo "#########################################"
TEST_LOG_DIR="$LOG_DIR/test_${k}"
mkdir -p "$TEST_LOG_DIR"
# --- 复制视频文件 k 份 ---
for ((i=1; i<=k; i++)); do
cp "$WORKDIR/$INPUT_FILE" "$WORKDIR/input_${i}.mp4"
done
# --- 阶段 1: 并行解码 ---
echo "--- 阶段 1: $k 路并行解码 ---"
for ((i=1; i<=k; i++)); do
$FFMPEG -nostdin -y -hide_banner \
-c:v h264_ascend \
-i "$WORKDIR/input_${i}.mp4" \
-pix_fmt nv12 \
-f rawvideo "$WORKDIR/decoded_npu_720p30_${i}.yuv" \
> "$TEST_LOG_DIR/decode_${i}.log" 2>&1 &
done
echo "等待 $TEST_DURATION 秒运行..."
sleep $TEST_DURATION
echo "停止解码进程..."
pkill -P $$ ffmpeg 2>/dev/null
parse_ffmpeg_logs "$TEST_LOG_DIR" "解码" "$k"
# --- 阶段 2: 并行编码 ---
echo "--- 阶段 2: $k 路并行编码 ---"
for ((i=1; i<=k; i++)); do
$FFMPEG -nostdin -y -hide_banner \
-f rawvideo -pix_fmt nv12 -s 1280x720 -r 30 \
-i "$WORKDIR/decoded_npu_720p30_${i}.yuv" \
-c:v h265_ascend -b:v 2M -maxrate 2M -minrate 2M -bufsize 4M -g 60 \
-an "$WORKDIR/encoded_npu_720p30_${i}.mp4" \
> "$TEST_LOG_DIR/encode_${i}.log" 2>&1 &
done
echo "等待 $TEST_DURATION 秒运行..."
sleep $TEST_DURATION
echo "停止编码进程..."
pkill -P $$ ffmpeg 2>/dev/null
parse_ffmpeg_logs "$TEST_LOG_DIR" "编码" "$k"
# --- 清理测试文件 ---
echo "--- 清理测试文件 ---"
for ((i=1; i<=k; i++)); do
rm -f "$WORKDIR/input_${i}.mp4" \
"$WORKDIR/decoded_npu_720p30_${i}.yuv" \
"$WORKDIR/encoded_npu_720p30_${i}.mp4"
done
done
echo
echo "=== ✅ 所有测试完成 ==="
echo "汇总结果保存在: $SUMMARY_CSV"
```