You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
srs/trunk/3rdparty/srs-bench
ChenGH 13597d1b7f
update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271)
update copyright to 2025

---------

Co-authored-by: john <hondaxiao@tencent.com>
Co-authored-by: winlin <winlinvip@gmail.com>
2 weeks ago
..
auto SquashSRS4: Add demo for RTC 4 years ago
blackbox update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
gb28181 update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
janus update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
live update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
pcap Add a TCP proxy for debugging. v6.0.117 (#3958) 11 months ago
srs update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
tcpproxy Add a TCP proxy for debugging. v6.0.117 (#3958) 11 months ago
vendor update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
vnet update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
.gitignore HLS: Ignore empty NALU to avoid error. v6.0.65 (#3750) 2 years ago
LICENSE update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago
Makefile SmartPtr: Support load test for source by srs-bench. v6.0.130 (#4097) 7 months ago
README.md SmartPtr: Fix SRT source memory leaking. v6.0.134 (#4106) 7 months ago
avatar.aac GB28181: Support GB28181-2016 protocol. v5.0.74 (#3201) 2 years ago
avatar.flv Squash: Merge SRS 4.0, regression test for RTMP. 3 years ago
avatar.h264 SquashSRS4: Regine DTLS and add regression tests. 4.0.84 4 years ago
avatar.h265 GB: Support HEVC for regression test and load tool for GB. (#3416) 2 years ago
avatar.ogg For regression test, add srs-bench to 3rdparty 4 years ago
bbb.flv Squash: Merge SRS 4.0, regression test for RTMP. 3 years ago
go.mod SmartPtr: Support load test for source by srs-bench. v6.0.130 (#4097) 7 months ago
go.sum SmartPtr: Support load test for source by srs-bench. v6.0.130 (#4097) 7 months ago
main.go update copyright to 2025. v5.0.218 v6.0.159 v7.0.21 (#4271) 2 weeks ago

README.md

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.

For RTMP/HLS/FLV benchmark, please use branch master.

Usage

下载代码和编译:

git clone -b feature/rtc https://github.com/ossrs/srs-bench.git && 
cd srs-bench && make

Note: 依赖Go编译工具建议使用 Go 1.17 及以上的版本。

编译会生成下面的工具:

  • ./objs/srs_bench 压测模拟大量客户端的负载测试支持SRS、GB28181和Janus三种场景。
  • ./objs/srs_test 回归测试(SRS)SRS服务器的回归测试。
  • ./objs/srs_gb28181_test 回归测试(GB28181)GB服务器的回归测试。
  • ./objs/srs_blackbox_test 黑盒测试(SRS)SRS服务器的黑盒测试也可以换成其他媒体服务器。

Note: 查看工具的全部参数请执行./objs/xx -h

有些场景若需要编译和启动SRS:

git clone https://github.com/ossrs/srs.git &&
cd srs/trunk && ./configure --h265=on --gb28181=on && make &&
./objs/srs -c conf/console.conf

Note: Use valgrind to check memory leak, please use valgrind --leak-check=full ./objs/srs -c conf/console.conf >/dev/null to start SRS.

具体场景,请按下面的操作启动测试。

Player for WHEP

直播播放压测,一个流,很多个播放。

首先推流到SRS

ffmpeg -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

Publisher for WHIP

直播或会议场景推流压测,一般会推多个流。

首先,推流依赖于录制的文件,请参考DVR

然后启动推流压测比如100个流

./objs/srs_bench -pr webrtc://localhost/live/livestream_%d -sn 100 -sa a.ogg -sv v.h264 -fps 25

注意帧率是原始视频的帧率由于264中没有这个信息所以需要传递。

Multiple WHIP or WHEP for 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

备注:压测都是基于流,可以任意设计推流和播放的流路数,实现不同的场景。

备注URL的变量格式参考Go的fmt.Sprintf,比如可以用webrtc://localhost/live/livestream_%03d

DVR for RTC Benchmark

录制场景,主要是把内容录制下来后,可分析,也可以用于推流。

首先推流到SRS参考live

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

备注:录制下来的a.oggv.h264可以用做推流。

RTC Plaintext

压测RTC明文播放

首先推流到SRS

ffmpeg -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?encrypt=false -nn 100

Note: 可以传递更多参数详细参考SRS支持的参数。

Reconnecting Load Test

建立连接和断开重连的压测可以测试SRS在多个Source时是否有内存泄露问题参考 #3667

RTMP重连测试

for ((i=0;;i++)); do
  ./objs/srs_bench -sfu=live -pr=rtmp://localhost/live${i}/stream -sn=1000 -cap=true; 
  sleep 10; 
done

SRT重连测试

for ((i=0;;i++)); do
  ./objs/srs_bench -sfu=live -pr='srt://127.0.0.1:10080?streamid=#!::'m=publish,r=live${i}/stream -sn=1000 -cap=true;
  sleep 10; 
done

WebRTC重连测试

for ((i=0;;i++)); do
  ./objs/srs_bench -sfu=rtc -pr=webrtc://localhost/live${i}/livestream -sn=1000 -cap=true;
  sleep 10; 
done

Regression Test

回归测试需要先启动SRS支持WebRTC推拉流

./objs/srs -c conf/rtc.conf

然后运行回归测试用例,如果只跑一次,可以直接运行:

go test ./srs -mod=vendor -v -count=1

也可以用make编译出重复使用的二进制

make && ./objs/srs_test -test.v

Note: 注意由于pion不支持DTLS 1.0所以SFU必须要支持DTLS 1.2才行。

运行结果如下:

$ make && ./objs/srs_test -test.v
=== RUN   TestRTCServerVersion
--- PASS: TestRTCServerVersion (0.00s)
=== RUN   TestRTCServerPublishPlay
--- PASS: TestRTCServerPublishPlay (1.28s)
PASS

可以给回归测试传参数,这样可以测试不同的序列,比如:

go test ./srs -mod=vendor -v -count=1 -srs-server=127.0.0.1
# Or
make && ./objs/srs_test -test.v -srs-server=127.0.0.1

可以只运行某个用例,并打印详细日志,比如:

make && ./objs/srs_test -test.v -srs-log -test.run TestRtcBasic_PublishPlay

支持的参数如下:

  • -srs-serverRTC服务器地址。默认值127.0.0.1
  • -srs-streamRTC流地址一般会加上随机的后缀。默认值/rtc/regression
  • -srs-timeout每个Case的超时时间毫秒。默认值5000即5秒。
  • -srs-publish-audio,推流时,使用的音频文件。默认值:avatar.ogg
  • -srs-publish-video,推流时,使用的视频文件。默认值:avatar.h264
  • -srs-publish-video-fps推流时视频文件的FPS。默认值25
  • -srs-vnet-client-ip,设置pion/vnet客户端的虚拟IP不能和服务器IP冲突。默认值192.168.168.168

其他不常用参数:

  • -srs-log,是否开启详细日志。默认值:false
  • -srs-play-ok-packets,播放时,收到多少个包认为是测试通过,默认值:10
  • -srs-publish-ok-packets,推流时,发送多少个包认为时测试通过,默认值:10
  • -srs-https是否连接HTTPS-API。默认值false即连接HTTP-API。
  • -srs-play-pli播放时PLI的间隔毫秒。默认值5000即5秒。
  • -srs-dtls-drop-packetsDTLS丢包测试丢了多少个包算成功默认值5

Note: 查看全部参数请执行./objs/srs_test -h

GB28181 Test

支持GB28181的压测使用选项-sfu gb28181可以查看帮助:

make && ./objs/srs_bench -sfu gb28181 --help

运行回归测试用例,更多命令请参考Regression Test

go test ./gb28181 -mod=vendor -v -count=1

也可以用make编译出重复使用的二进制

make && ./objs/srs_gb28181_test -test.v

支持的参数如下:

  • -srs-sipSIP服务器地址。默认值tcp://127.0.0.1:5060
  • -srs-streamGB的user即流名称一般会加上随机的后缀。默认值3402000000
  • -srs-timeout每个Case的超时时间毫秒。默认值11000即11秒。
  • -srs-publish-audio,推流时,使用的音频文件。默认值:avatar.aac
  • -srs-publish-video,推流时,使用的视频文件,注意:扩展名.h264表明编码格式为AVC.h265表明编码格式为HEVC。默认值:avatar.h264
  • -srs-publish-video-fps推流时视频文件的FPS。默认值25

其他不常用参数:

  • -srs-log,是否开启详细日志。默认值:false

Note: 查看全部参数请执行./objs/srs_gb28181_test -h

Blackbox Test

使用FFmpeg作为客户端对流媒体服务器SRS进行黑盒压测完全黑盒的回归测试。

运行回归测试用例,如果只跑一次,可以直接运行:

go test ./blackbox -mod=vendor -v -count=1

也可以用make编译出重复使用的二进制

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.v

Note: 依赖SRS二进制当然也可以在这个Docker中编译SRS具体请参考SRS的Wiki。

支持的参数如下:

  • -srs-binary每个测试用例都需要启动一个SRS服务因此需要设置SRS的位置。默认值../../objs/srs
  • -srs-ffmpegFFmpeg工具的位置用来推流和录制。默认值ffmpeg
  • -srs-ffprobeffprobe工具的位置用来分析流的信息。默认值ffprobe
  • -srs-timeout每个Case的超时时间毫秒。默认值64000即64秒。
  • -srs-publish-avatar,测试源文件路径。默认值:avatar.flv
  • -srs-ffprobe-duration每个Case的探测时间毫秒。默认值16000即16秒。
  • -srs-ffprobe-timeout每个Case的探测超时时间毫秒。默认值21000即21秒。

其他不常用参数:

  • -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详细日志。默认值false

由于每个黑盒的用例时间都很长,可以开启并行:

./objs/srs_blackbox_test -test.v -test.parallel 8

Note: 查看全部参数请执行./objs/srs_blackbox_test -h

GCOVR

本机生成覆盖率时,我们使用工具gcovr

在macOS上安装gcovr

pip3 install gcovr

在CentOS上安装gcovr

yum install -y python2-pip &&
pip install lxml && pip install gcovr

Janus

支持Janus的压测使用选项-sfu janus可以查看帮助:

make && ./objs/srs_bench -sfu janus --help

首先需要启动Janus推荐使用janus-docker:

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

若启动成功,打开页面,可以自动入会:http://localhost: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

Install LIBSRT

我们使用 srtgo 库测试SRT协议需要安装libsrt库 参考macOS

brew install srt

如果是Ubuntu可以参考Ubuntu:

apt-get install -y libsrt

安装完libsrt后直接编译srs-bench即可

make

Ubuntu Docker

如果使用Ubuntu编译推荐使用 ossrs/srs:ubuntu20 作为镜像编译已经编译了openssl和libsrt启动容器

docker run --rm -it -v $(pwd):/g -w /g ossrs/srs:ubuntu20 make

GoLand

使用GoLand编译和调试时需要设置libsrt的环境变量首先可以使用brew获取路径

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 -lsrt

Note: 特别注意的是CGO_LDFLAGS是可以有空格的不能使用字符串否则找不到库。

2021.01, Winlin