300I DUO如何达到1080P 256路并发?
收藏回复举报
300I DUO如何达到1080P 256路并发?
发表于2025-11-12 14:18:57
0 查看

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

06EE8E82-2089-4f57-82C1-D4FA3B6928AD.png

```

#!/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"

```

本帖最后由 匿名用户2025/11/13 16:05:46 编辑

我要发帖子