ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

SRS Bench 压测与回归测试实战指南:WebRTC、RTMP、GB28181 全协议压测工具详解

SRS Bench 压测与回归测试实战指南:WebRTC、RTMP、GB28181 全协议压测工具详解 SRS Bench 压测与回归测试实战指南WebRTC、RTMP、GB28181 全协议压测工具详解【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srsSBSRS Bench是随 SRS 媒体服务器一起维护的一套压测Benchmark与回归测试Regression Test工具集位于仓库的 trunk/3rdparty/srs-bench 目录。它基于 Go 语言实现可以针对 SRS 及其他媒体服务器执行 HTTP-FLV、RTMP、HLS、WebRTCWHIP/WHEP和 GB28181 等多协议的负载压测、回归测试与黑盒测试。本文以该目录下的 README.md 为主体结合源码main.go、Makefile与 SRS 回归测试配置regression-test-for-clion.conf系统讲解工具的编译、四种产物的用法、各场景压测命令、回归测试参数以及覆盖率统计、Janus 压测、SRT 依赖安装与 IDE 调试等进阶话题。读完本文你可以独立搭建一套覆盖 SRS 全协议的压测与回归验证环境。一、srs-bench 是什么一套工具四种产物srs-bench 是一个独立维护的 Go 项目在 SRS 主仓库中以第三方子项目形式嵌入trunk/3rdparty/srs-bench。它的定位是SB(SRS Bench) is a set of benchmark and regression test tools, for SRS and other media servers, supports HTTP-FLV, RTMP, HLS, WebRTC and GB28181.也就是说它既可以压测 SRS 自身也可以压测其他兼容协议实现的媒体服务器。按目标服务器类型压测工具通过-sfu参数区分四种模式见 main.go 的参数分发逻辑-sfu取值目标服务器覆盖协议rtc/srs默认SRS WebRTC SFU 服务器WebRTC / WHIP / WHEPliveSRS 直播服务器RTMP / HTTP-FLV / HLSjanusJanus WebRTC SFU 服务器Janus 私有协议videoroomgb28181GB 媒体服务器GB28181 国标协议执行make编译后会在./objs目录下生成以下四个工具./objs/srs_bench压测工具模拟大量客户端的负载测试支持 SRS、GB28181 和 Janus 三种场景./objs/srs_testSRS 服务器回归测试工具./objs/srs_gb28181_testGB28181 服务器GB 网关回归测试工具./objs/srs_blackbox_testSRS 服务器黑盒测试工具也可以换成其他媒体服务器。此外Makefile 还支持构建一个额外的./objs/pcap_simulator由pcap/*.go编译用于 pcap 报文模拟测试。查看任意工具的全部参数直接执行./objs/xx -h即可。二、编译环境与构建流程2.1 获取代码与编译srs-bench 以独立仓库形式维护RTMP/HLS/FLV 压测使用 master 分支WebRTC 相关能力在feature/rtc分支上。如果你在 SRS 主仓库内工作srs-bench 已经内嵌在trunk/3rdparty/srs-bench无需重复克隆如果需要独立获取命令如下git clone -b feature/rtc srs-bench 仓库地址 cd srs-bench makeNote: 依赖 Go 编译工具建议使用 Go 1.21 及以上的版本。当前仓库的 go.mod 声明go 1.23.0编译依赖 vendor 目录-modvendor。2.2 Makefile 构建目标Makefile 提供以下目标目标产物说明make defaultsrs_benchsrs_testsrs_gb28181_testsrs_blackbox_test默认入口等同bench testmake bench./objs/srs_bench压测工具make test./objs/srs_test、./objs/srs_gb28181_test、./objs/srs_blackbox_test三个回归测试工具make pcap./objs/pcap_simulatorpcap 模拟器make clean—删除./objs目录make all全部bench pcap test值得注意的编译细节Makefile 会根据系统自动设置 CGO 编译参数——macOS 下通过brew --prefix srt定位 libsrtLinux 下使用/usr/local/include、/usr/local/lib并额外链接-lcrypto -lstdc -lm -ldl对应 openssl 与 C 运行时。这是因为 srs-bench 通过 srtgo依赖见 go.mod测试 SRT 协议需要系统安装 libsrt 库。2.3 编译并启动被压测的 SRS部分场景回归测试、黑盒测试需要先编译并启动 SRS 服务器git clone 本仓库地址 cd srs/trunk ./configure --h265on --gb28181on make ./objs/srs -c conf/regression-test-for-clion.confNote: 若需用 valgrind 检查内存泄漏可用valgrind --leak-checkfull ./objs/srs -c conf/regression-test-for-clion.conf /dev/null启动 SRS。--h265on开启 HEVC 支持、--gb28181on开启 GB28181 国标能力两者都直接服务于本文后面的 WebRTC 与 GB28181 测试场景。回归测试使用的 regression-test-for-clion.conf 是一个全家桶配置它同时开启 RTMP1935、GB28181 的 stream_casterUDP 9000 SIP 5060、HTTP 服务8080、HTTP API1985、RTC8000candidate 为$CANDIDATE环境变量、RTSP8554并在vhost __defaultVhost__下开启rtmp_to_rtc、rtc_to_rtmp、rtmp_to_rtsp等转换能力保证各协议测试用例都有对应的服务端口可用。三、WebRTC 播放压测WHEP Player场景直播播放压测——一个流很多个播放端。第一步推流到 SRS使用仓库自带的测试源文件 trunk/doc/source.200kbps.768x320.flvffmpeg -re -i doc/source.200kbps.768x320.flv -c copy -f flv -y rtmp://localhost/live/livestream第二步启动播放压测例如模拟 100 个播放端./objs/srs_bench -sr webrtc://localhost/live/livestream -nn 100-sr指定播放subscribe的 WebRTC URL-nn指定模拟客户端数量。从 srs/srs.go 的实现可以看到播放端以 goroutine 并发启动每个客户端之间默认间隔-delay默认 50ms毫秒以避免瞬间连接风暴同时每个客户端都会向 SRS 发起 WHEP 拉流。四、WebRTC 推流压测WHIP Publisher场景直播或会议场景推流压测一般会推多个流。第一步准备推流源文件推流依赖录制的文件请参考下文「DVR 录制」章节用播放端把流录制为a.ogg音频和v.h264视频。第二步启动推流压测例如模拟 100 个流./objs/srs_bench -pr webrtc://localhost/live/livestream_%d -sn 100 -sa a.ogg -sv v.h264 -fps 25参数说明-pr推流publish的 URL其中%d是流号占位符-sn流的数量-sa/-sv推流使用的音频 / 视频源文件-fps视频帧率。注意帧率是原始视频的帧率由于 H.264 裸流中不包含该信息所以必须通过-fps显式传递。源码 srs/srs.go 对推流参数做了严格校验-sv必须以.h264结尾且指定.h264视频源时-fps必须大于 0否则直接报错退出。五、多路 WHIP/WHEP 混编压测RTC 会议场景场景会议场景的播放压测——多个客户端播放多个流。比如 3 人会议3 个推流每个流 2 个播放。第一步启动推流压测3 个流./objs/srs_bench -pr webrtc://localhost/live/livestream_%d -sn 3 -sa a.ogg -sv v.h264 -fps 25第二步每个流都启动播放压测每个流 2 个播放端./objs/srs_bench -sr webrtc://localhost/live/livestream_%d -sn 3 -nn 2备注压测都是基于流的可以任意设计推流和播放的流路数从而组合出不同的场景1 推 N 播、N 推 N 播、纯推流、纯拉流等。备注URL 中的变量格式参考 Go 的fmt.Sprintf例如可以用webrtc://localhost/live/livestream_%03d生成零填充的三位流号。从 srs/srs.go 的实现可以看到当-sn 1且 URL 中不包含%时工具会自动在 URL 末尾追加%d再按流号i逐一格式化因此%d/%03d这种占位符是设计好的流变量机制。六、DVR 录制为压测准备推流素材场景把直播内容录制下来既可用于事后分析也可以把录制产物用作推流源文件。第一步推流到 SRS参考第三节的推流命令ffmpeg -re -i doc/source.200kbps.768x320.flv -c copy -f flv -y rtmp://localhost/live/livestream第二步启动录制./objs/srs_bench -sr webrtc://localhost/live/livestream -da a.ogg -dv v.h264-da录制的音频输出文件OGG 格式-dv录制的视频输出文件H.264 裸流格式。备注录制下来的a.ogg和v.h264可以直接用作第四节推流压测的-sa/-sv源文件形成录制 → 推流压测的自循环素材链。源码校验srs/srs.go要求-dv输出文件必须为.ivf或.h264结尾并且录制只在第一个流i 0上进行后续流的-da/-dv会被置空避免并发写同一文件见 srs/srs.go。七、RTC 明文非加密压测场景压测 RTC 明文播放跳过 DTLS 加密用于排查加密开销或简化抓包分析。第一步推流到 SRSffmpeg -re -i doc/source.200kbps.768x320.flv -c copy -f flv -y rtmp://localhost/live/livestream第二步启动压测在 URL 上附加?encryptfalse指定明文非加密模式例如 100 个播放端./objs/srs_bench -sr webrtc://localhost/live/livestream?encryptfalse -nn 100Note: URL 上可以传递更多参数详细参考 SRS 支持的 WebRTC 查询参数。八、重连压测Reconnecting Load Test场景建立连接、断开、再重连的循环压测主要用于验证 SRS 在多个 Source 场景下是否存在内存泄漏对应 SRS 讨论区 Issue #3667 中关于内存泄漏的讨论。三个协议的循环重连脚本-captrue表示推流完成后立即关闭连接形成连上 → 推流 → 断开 → 重连的节律RTMP 重连测试for ((i0;;i)); do ./objs/srs_bench -sfulive -prrtmp://localhost/live${i}/stream -sn1000 -captrue; sleep 10; doneSRT 重连测试注意 SRT 的 streamid 中带#!::特殊字符需要用单引号包裹for ((i0;;i)); do ./objs/srs_bench -sfulive -prsrt://127.0.0.1:10080?streamid#!::mpublish,rlive${i}/stream -sn1000 -captrue; sleep 10; doneWebRTC 重连测试for ((i0;;i)); do ./objs/srs_bench -sfurtc -prwebrtc://localhost/live${i}/livestream -sn1000 -captrue; sleep 10; done每轮循环都使用新的流号live${i}配合-capclose after publish在推流完成后关闭连接10 秒后再开启下一轮从而持续制造 Source 的创建与销毁。配合 valgrind见 2.3 节运行 SRS即可观察是否存在内存持续增长。九、SRS 回归测试srs_test回归测试需要先启动支持 WebRTC 推拉流的 SRS./objs/srs -c conf/regression-test-for-clion.conf然后运行回归测试用例。如果只跑一次可以直接用 go testgo test ./srs -modvendor -v -count1也可以用 make 编译出可重复使用的二进制make ./objs/srs_test -test.vNote: 由于 pion 不支持DTLS 1.0所以被测 SFUSRS必须支持DTLS 1.2才行。SRS 的 rtc_server 默认即支持 DTLS 1.2。运行结果示例如下$ make ./objs/srs_test -test.v RUN TestRTCServerVersion --- PASS: TestRTCServerVersion (0.00s) RUN TestRTCServerPublishPlay --- PASS: TestRTCServerPublishPlay (1.28s) PASS回归测试用例位于 trunk/3rdparty/srs-bench/srs 目录如 rtc_test.go、rtmp_test.go、srs_test.go覆盖 RTC 推拉流、RTMP、Stat API、NACK 行为等回归点例如TestPR2483_RtcStatApi_PublisherOnly验证推流后 RTC Stat API 能查询到流TestBugfix2371_PublishWithNack验证 SDP 协商中 NACK 的数量。9.1 传参与运行指定用例可以给回归测试传参数测试不同的序列例如指定服务器地址go test ./srs -modvendor -v -count1 -srs-server127.0.0.1 # Or make ./objs/srs_test -test.v -srs-server127.0.0.1只运行某个用例并打印详细日志make ./objs/srs_test -test.v -srs-log -test.run TestRtcBasic_PublishPlay9.2 srs_test 支持的参数常用参数参数含义默认值-srs-serverRTC 服务器地址127.0.0.1-srs-streamRTC 流地址一般会加上随机的后缀/rtc/regression-srs-timeout每个 Case 的超时时间毫秒50005 秒-srs-publish-audio推流时使用的音频文件avatar.ogg-srs-publish-video推流时使用的视频文件avatar.h264-srs-publish-video-fps推流时视频文件的 FPS25-srs-vnet-client-ip设置 pion/vnet 客户端的虚拟 IP不能和服务器 IP 冲突vnet 实现在 trunk/3rdparty/srs-bench/vnet192.168.168.168其他不常用参数参数含义默认值-srs-log是否开启详细日志false-srs-play-ok-packets播放时收到多少个包认为是测试通过10-srs-publish-ok-packets推流时发送多少个包认为测试通过10-srs-https是否连接 HTTPS-APIfalse即连接 HTTP-API-srs-play-pli播放时 PLI关键帧请求的间隔毫秒50005 秒-srs-dtls-drop-packetsDTLS 丢包测试丢多少个包算成功5Note: 查看全部参数请执行./objs/srs_test -h。十、GB28181 回归测试srs_gb28181_test支持 GB28181 国标协议的压测与回归测试。查看 GB28181 模式的帮助使用-sfu gb28181选项make ./objs/srs_bench -sfu gb28181 --help运行回归测试用例更多命令参考第九节go test ./gb28181 -modvendor -v -count1也可以编译出重复使用的二进制make ./objs/srs_gb28181_test -test.vGB28181 测试用例位于 trunk/3rdparty/srs-bench/gb28181 目录其中 sip.go 实现 SIP 信令基于 gosip 库见 go.modingester.go、ps.go 负责 PS 封装媒体的发送h265reader.go 负责 H.265 码流读取。10.1 srs_gb28181_test 支持的参数常用参数参数含义默认值-srs-sipSIP 服务器地址tcp://127.0.0.1:5060-srs-streamGB 的 user即流名称一般会加上随机的后缀3402000000-srs-timeout每个 Case 的超时时间毫秒1100011 秒-srs-publish-audio推流时使用的音频文件avatar.aac-srs-publish-video推流时使用的视频文件。注意扩展名.h264表明编码格式为AVC.h265表明编码格式为HEVCavatar.h264-srs-publish-video-fps推流时视频文件的 FPS25其他不常用参数参数含义默认值-srs-log是否开启详细日志falseNote: 查看全部参数请执行./objs/srs_gb28181_test -h。仓库内附带 GB28181 测试用的媒体素材包括 avatar.aac音频和 avatar.h265HEVC 视频配合 SRS 的stream_casterGB28181 → RTMP见 regression-test-for-clion.conf 中 UDP 9000 与 SIP 5060 的配置即可完成国标设备模拟器 → SRS的全链路回归。十一、黑盒测试srs_blackbox_test定位使用 FFmpeg 作为客户端对流媒体服务器 SRS 进行完全黑盒的压测与回归测试——测试程序不关心服务器内部实现只通过标准协议与 FFmpeg 工具交互。运行回归测试用例只跑一次go test ./blackbox -modvendor -v -count1编译出重复使用的二进制make ./objs/srs_blackbox_test -test.v由于黑盒测试依赖特殊的 FFmpeg可以在 Docker 中编译和启动docker run --rm -it -v $(pwd):/g -w /g ossrs/srs:ubuntu20 bash make ./objs/srs_blackbox_test -test.vNote: 依赖 SRS 二进制当然也可以在这个 Docker 中编译 SRS。黑盒测试用例位于 trunk/3rdparty/srs-bench/blackbox 目录覆盖 RTMPrtmp_test.go、HLShls_test.go、SRTsrt_test.go、RTSPrtsp_test.go、HTTP APIhttp_api_test.go、MP3mp3_test.go、DVRdvr_test.go与 HEVChevc_test.go等场景。黑盒测试的源文件为 avatar.flv。11.1 srs_blackbox_test 支持的参数常用参数参数含义默认值-srs-binary每个测试用例都需要启动一个 SRS 服务因此需要设置 SRS 的位置../../objs/srs-srs-ffmpegFFmpeg 工具的位置用来推流和录制ffmpeg-srs-ffprobeffprobe 工具的位置用来分析流的信息ffprobe-srs-timeout每个 Case 的超时时间毫秒6400064 秒-srs-publish-avatar测试源文件路径avatar.flv-srs-ffprobe-duration每个 Case 的探测时间毫秒1600016 秒-srs-ffprobe-timeout每个 Case 的探测超时时间毫秒2100021 秒其他不常用参数参数含义默认值-srs-log是否开启详细日志false-srs-stdout是否开启 SRS 的 stdout 详细日志false-srs-ffmpeg-stderr是否开启 FFmpeg 的 stderr 详细日志false-srs-dvr-stderr是否开启 DVR 的 stderr 详细日志false-srs-ffprobe-stdout是否开启 FFprobe 的 stdout 详细日志false11.2 并行加速由于每个黑盒用例的时间都很长单个用例默认 64 秒超时可以开启并行加速./objs/srs_blackbox_test -test.v -test.parallel 8Note: 查看全部参数请执行./objs/srs_blackbox_test -h。十二、覆盖率统计GCOVR在本机生成覆盖率报告时srs-bench 使用 gcovr 工具。macOS 上安装 gcovrpip3 install gcovrCentOS 上安装 gcovryum install -y python2-pip pip install lxml pip install gcovr十三、Janus 压测srs-bench 也支持对 Janus WebRTC SFU 服务器进行压测。查看 Janus 模式的帮助make ./objs/srs_bench -sfu janus --help启动 Janus推荐使用 janus-docker 方式需先准备janus.jcfg与janus.plugin.videoroom.jcfg配置文件并修正 NAT 映射ip$(ifconfig en0 inet|grep inet|awk {print $2}) sed -i s/nat_1_1_mapping.*/nat_1_1_mapping\$ip\/g janus.jcfg docker run --rm -it -p 8080:8080 -p 8443:8443 -p 20000-20010:20000-20010/udp \ -v $(pwd)/janus.jcfg:/usr/local/etc/janus/janus.jcfg \ -v $(pwd)/janus.plugin.videoroom.jcfg:/usr/local/etc/janus/janus.plugin.videoroom.jcfg \ registry.cn-hangzhou.aliyuncs.com/ossrs/janus:v1.0.7若启动成功打开页面即可自动入会默认 8080 端口。模拟 5 个推流入会可以在页面看到入会的流make -j10 ./objs/srs_bench -sfu janus \ -pr webrtc://localhost:8080/2345/livestream \ -sa avatar.ogg -sv avatar.h264 -fps 25 -sn 5模拟 5 个拉流入会只拉流不推流make -j10 ./objs/srs_bench -sfu janus \ -sr webrtc://localhost:8080/2345/livestream \ -nn 5十四、SRT 依赖安装与 IDE 调试14.1 安装 libsrtsrs-bench 使用 srtgo 库测试 SRT 协议需要安装 libsrt 库CGO 链接macOSbrew install srtUbuntuapt-get install -y libsrt安装完 libsrt 后直接编译 srs-bench 即可make14.2 Ubuntu Docker 编译如果使用 Ubuntu 编译推荐使用ossrs/srs:ubuntu20镜像已预编译 openssl 和 libsrtdocker run --rm -it -v $(pwd):/g -w /g ossrs/srs:ubuntu20 make14.3 GoLand 调试环境配置使用 GoLand 编译和调试时需要设置 libsrt 的环境变量。首先可以用 brew 获取 libsrt 路径brew --prefix srt # /opt/homebrew/opt/srt然后在 GoLand 中Edit Configurations添加环境变量CGO_CFLAGS-I/opt/homebrew/opt/srt/include;CGO_LDFLAGS-L/opt/homebrew/opt/srt/lib -lsrtNote: 特别注意的是CGO_LDFLAGS是可以有空格的不能使用字符串引号包裹形式否则会找不到库。十五、总结如何组合使用这套工具综合来看srs-bench 围绕压测 回归两条主线提供了完整的工具链负载压测srs_bench通过-sfu切换 rtc/live/gb28181/janus 四种目标配合-nn客户端数、-sn流路数、-sr/-pr拉流/推流 URL 与%d流变量、-delay启动间隔、-cap推后即断、-stat统计 API等参数可以组合出单流多播、多流多播、纯推流、会议混编、重连风暴等任意负载模型回归测试srs_test、srs_gb28181_test覆盖 SRS 的 WebRTC/RTMP 与国标 GB28181 协议行为参数化的-srs-server、-srs-timeout、-srs-play-ok-packets等选项让每条用例可独立调参黑盒测试srs_blackbox_test以 FFmpeg 为客户端对 SRS 的 RTMP/HLS/SRT/RTSP/HTTP-API/DVR/HEVC 能力做端到端验证适合做发布前的全量回归辅助能力GCOVR 覆盖率统计、DVR 录制造素材、pcap 模拟器、Docker 化编译与 GoLand 调试配置共同构成完整的压测研发闭环。所有工具的完整参数都可以通过./objs/xx -h查询。如需深入源码可以从 main.go参数分发→ srs/srs.goRTC 压测实现→ srs/rtc_test.go回归用例这条链路读起。【免费下载链接】srsSRS is a simple, high-performance, AI-driven real-time media server supporting RTMP, WebRTC, HLS, HTTP-FLV, HTTP-TS, SRT, MPEG-DASH, and GB28181, with codec support for H.264, H.265, AV1, VP9, AAC, Opus, and G.711.项目地址: https://gitcode.com/GitHub_Trending/sr/srs创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表