前言
SRS支持将直播录制为VoD文件,在压测时,如果流路数很多,会出现CPU消耗很多的问题。
原因是写入较小视频包时,SRS使用了write,由于没有缓冲能力,导致频繁的系统调用和磁盘繁忙。
优化方案,可以选择fwrite(v5.0.133+),或者老版本用内存盘方案,可将DVR性能提升一倍以上。
环境
SRS服务器配置如下:
• CPU:INTEL Xeon 4110 双路16和32线程
• 内存:32G
• 网卡:10Gb
• 磁盘:两块980G的SSD盘做成RAID0(可用空间共1.8T)
• 操作系统:CentOS 7.6。
• 流码率:3Mbps
这里需要说明一下,采用SSD盘主要是为了确保磁盘性能足够,以确保能够支撑大的并发压力,从而在大并发压测的情况下观察系统性能情况,如果本身磁盘I/O性能比较低下,大量的I/O等待可能导致观察不到CPU瓶颈的现象。
另外,在我的测试环境中,SRS经过了多进程改造,能够支持推流进来后自动将不同的流均衡到不同的SRS进程上面,从而能够充分利用服务器多核的能力,但是由此得出的结论同样适合于单进程SRS。
SRS开启DVR录存功能,使用如下命令启动SRS:
env SRS_LISTEN=1935 SRS_MAX_CONNECTIONS=3000 SRS_DAEMON=off SRS_SRS_LOG_TANK=console \
SRS_HTTP_API_ENABLED=on SRS_VHOST_DVR_ENABLED=on ./objs/srs -e
压测工具,用srs_bench套件中的sb_rtmp_publish模拟推流客户端进行大并发量推流模拟,一台机器压测能力不够可以开启多台机器进行压测。
./objs/sb_rtmp_publish -i doc/source.200kbps.768x320.flv \
-c 100 -r rtmp://127.0.0.1:1935/live/livestream_{i}
启动srs后,用压测工具进行压测,观察测试过程中的CPU、网络IO、磁盘IO相关数据,并进行对比。
写入SSD Disk
SRS优化前,默认的方式就是使用write方法,直接写入磁盘。测试能支持1000路写入,CPU跑满。