各种流媒体服务器性能测试

摘要:
如今,有一个80Gbps 10Gbps的网络环境。我编写了一个压力测试工具来比较各种流媒体服务器在超级并发下的性能。我听说英特尔的10Gbps网卡有问题,只能达到无法达到的理论带宽。我已经测试过了。使用最新的Intel驱动程序Centos6,它可以首次达到理论带宽的80%,最高可达95%。根本没有问题,应该注意的是,nginx采用了异步架构,因为rtmp协议实际上失去了一些性能。事实上,http的性能高于此。wowza3的CPU/Mem/Load是一堆狗屎。

  今天正好有80Gbps的万兆网络环境,写了一个压力测试工具,对比了一下各种流媒体服务器,在超级并发下的性能如何,原来听说intel的万兆网卡有问题,只能跑到不到的理论带宽,这点我测试过了,用intel最新的驱动,centos6,最次能跑到80%的理论带宽,最高能跑到95%以上,完全没有问题,需要注意的是nginx 采用异步架构,因为rtmp协议实际上损失了部分性能,实际上http的性能比这个更高。http跑到过72Gbps,带宽的90%。

nginx-rtmp做edge的配置: 
  1. rtmp {

  2. server {

  3. listen 1935;

  4. application edge{

  5. live on;

  6. pull rtmp://127.0.0.1:2935/live;

  7. }

  8. }

  9. }

也就是说,源站的播放地址是:rtmp://192.168.1.50:2935/live/livestream,而边缘的播放地址是:rtmp://192.168.1.50:1935/edge/livestream

Wowza2的配置: 
  1. 修改:/usr/local/WowzaMediaServer/bin/startup.sh

  2. 多分配内存,否则无法支持8k连接:-Xms2024m -Xmx6048m

  3. java -server -Djava.net.preferIPv4Stack=true -Dcom.sun.management.jmxremote=true -Xms2024m -Xmx13048m -Dcom.wowza.wms.AppHome=/usr/local/WowzaMediaServer -Dcom.wowza.wms.ConfigURL= -Dcom.wowza.wms.ConfigHome=/usr/local/WowzaMediaServer -cp /usr/local/WowzaMediaServer/bin/wms-bootstrap.jar com.wowza.wms.bootstrap.Bootstrap start

  4. 修改Ping超时设置:

  5. /usr/local/WowzaMediaServer/conf/live/Application.xml

  6. <ApplicationTimeout>60000000</ApplicationTimeout>

  7. <PingTimeout>12000000</PingTimeout>

Wowza3的配置: 
  1. 修改:/usr/local/WowzaMediaServer/bin/startup.sh

  2. 多分配内存,否则无法支持8k连接:-Xms2024m -Xmx6048m

  3. $_EXECJAVA -server -Xms2024m -Xmx13048m -Djava.net.preferIPv4Stack=true $JMXOPTIONS -Dcom.wowza.wms.runmode="$mode" -Dcom.wowza.wms.native.base="linux" -Dcom.wowza.wms.AppHome="$WMSAPP_HOME" -Dcom.wowza.wms.ConfigURL="$WMSCONFIG_URL" -Dcom.wowza.wms.ConfigHome="$WMSCONFIG_HOME" -cp $WMSAPP_HOME/bin/wms-bootstrap.jar com.wowza.wms.bootstrap.Bootstrap start

  4. 修改Ping超时设置:

  5. /usr/local/WowzaMediaServer/conf/live/Application.xml

  6. <ApplicationTimeout>60000000</ApplicationTimeout>

  7. <PingTimeout>12000000</PingTimeout>


测试数据如下。 

Test 5k Clients

5.5k的数据如下:

RTMP 900kbps 5k Clients
 Wowza2Wowza3SmartServerNginxRtmp(Origin)NginxRtmp(Edge)
CPU663.9%1247.5%494%310%425%
Mem1GB6.7GB118MB216MB244MB
Load3.9926.534.063.334.77
Process11888
Threads242242888
Bandwidth Required4.68Gbps4.68Gbps4.68Gbps4.68Gbps4.68Gbps
Bandwidth Actual4.14Gbps4.2Gbps4.5Gbps4.9Gbps4.9Gbps
Connections51685203520152045202
Client-Load5.6826.533.707.7410.94
FlashPlay(Win7) delay7s-s1.2s3s1s
Architecturejava, 
single-process, 
multiple-thread
java, 
single-process, 
multiple-thread
c++/st, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process,
single-thread,
async-socket

比起Wowza2,后者的效率高20%,内存使用只有10%,延迟极佳。wowza3的CPU/Mem/Load就是一坨屎。

Test 8k Clients

8k连接的数据如下:

RTMP 900kbps 8k Clients
 Wowza2Wowza3SmartServerNginxRtmp(Origin)NginxRtmp(Edge)
CPU811.6%1472.3%813.7%488%575%
Mem5GB10GB188MB254MB307MB
Load5.5529.167.185.535.08
Process111288
Threads2422421288
Bandwidth Required7.2Gbps7.2Gbps7.2Gbps7.2Gbps7.2Gbps
Bandwidth Actual6.5Gbps3.6Gbps7.6Gbps7.6Gbps7.5Gbps
Connections80038003800180048002
Client-Load13.312.7312.0517.8117.94
FlashPlay(Win7) delay14s-s1s4s1.7s
Architecturejava, 
single-process, 
multiple-thread
java, 
single-process, 
multiple-thread
c++/st, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process,
single-thread,
async-socket

比起Wowza2,后者的内存使用只有0.5%,延迟极佳。Wowza3跑不到8k。

Test 12k Clients

12k连接的数据如下,12k左右时带宽需要达到10Gbps:

RTMP 900kbps 12k Clients
 Wowza2Wowza3SmartServerNginxRtmp(Origin)NginxRtmp(Edge)
CPU1743.1%不支持864.7%487%378%
Mem11GB不支持1.7GB342MB378MB
Load13不支持3.394.353.96
Process111788
Threads2422421788
Bandwidth Required10Gbps不支持9.9Gbps10Gbps10Gbps
Bandwidth Actual7.4Gbps不支持10.1Gbps8.5Gbps8.48Gbps
Connections12002不支持112451200411960
Client-Load3不支持29.9430.4730.29
FlashPlay(Win7) delayNaN
(客户端
直接卡死)
不支持1.7s3s1.3s
Architecturejava, 
single-process, 
multiple-thread
java, 
single-process, 
multiple-thread
c++/st, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process, 
single-thread,
async-socket
c, 
multiple-process,
single-thread,
async-socket

可见,wowza2/3根本就无法达到10Gbps,尽管在80Gbps带宽中也达不到(http可是能到72Gbps)。而nginx同源架构的rtmp服务器,也能到10Gbps。

因为客户端负载过高(29.9),所以无法继续开更多客户端测试,服务器的负载还很低,还可以开启更多的客户端。

其他因素

除了性能之外,网络服务器需要考虑的因素包括:

其他对比
 Wowza2SmartServerNginxRtmp
集群Origin+EdgeEdgeOrigin+Edge
主备不支持支持不支持
直播转码支持不支持支持
HLS支持不支持支持
可维护性容易容易很难
监控数据不支持支持不支持
HTTP接口不支持不支持支持
Reload不支持支持支持
带宽检测不支持支持不支持
极简配置不支持支持部分支持
(Edge回源时
必须指定app)

理论上,nginx或者st这种架构,为网络服务器的最优架构。

多进程+单线程+异步socket+HTTP===超级网络服务器(nginx)。

多进程+单线程+异步socket+Rtmp===超级RTMP服务器(nginx-rtmp/SmartServer)。

免责声明:文章转载自《各种流媒体服务器性能测试》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇微信小程序 npm 找不到npm包 没有找到可以构建的npm包 如何使用第三方npm组件国外一些好的开源商城系统(15个)下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

RTMP,RTMPT,RTMPS,RTMPE,RTMPTE协议的介绍

1. AMFAMF(是Action Message Format的缩写)是在flash和flex中与远程服务端交换数据的一种格式.它是二进制格式,Flash应用与服务端或数据库通过RPC交换数据时,通常都采用这种格式。AMF 1 诞生于Flash Player6,发展到现在已经变成了了AMF32. RTMPRTMP是Real-Time Messaging...

EasyDSS高性能流媒体服务器前端重构(六)- webpack-dev-server 支持手机端访问

很多时候,前端开发的页面,不仅要在PC端测试效果, 还要在手机端测试效果. 在开发阶段, 我们以 webpack-dev-server 来启动浏览器, 打开正在开发的页面. webpack-dev-server 可以做到实时监听文件修改, 自动更新浏览器中的网页, 一旦代码发生修改, 无须人工干预, 页面就同步到最新状态. 但是 webpack-dev-s...

基于EasyNVR摄像机流媒体服务器实现RTSP或Onvif监控摄像头Web无插件化直播监控之录像版与直播版的区别

EasyNVR的使用者应该都清楚的知道,EasyNVR一个强大的功能就是可以进行全平台的无插件直播。主要原因在于rtsp协议的视频流(默认是需要插件才可以播放的)经由EasyNVR处理后可以满足无插件的全平台直播。处理后会获取到RTMP、HLS、RTSP、FLV视频流,这就完美解决了无插件直播的问题,只要终端设备支持H5,就可以完美的播放EasyNVR分发...

海康定制RTMP推流摄像头如何接入EasyDSS视频直播点播平台?

我们最近在海康定制了一批摄像头,包含枪机和半球机,支持RTSP、RTMP、GB/T28181多种协议,现在已经上线了,有兴趣的朋友可以去我们的淘宝店具体了解。 这两款摄像头上线以来,有很多曾经使用过我们的流媒体服务器的用户都来咨询,并且对摄像头的推流过程比较感兴趣,所以本文我们就来讲一下这两款推流摄像头是怎么接入流媒体平台的,本文以EasyDSS视频直播点...

用Darwin开发分布式流媒体服务器

我介绍的是如何在DSS的基础上进行改造,分别开发成为分布式流媒体系统中的设备接入服务(设备主动注册上线)与流媒体分发服务。大家肯定会奇怪,DSS怎么改造成设备接入服务呢,其实,以DSS的架构,完全可以改造成大部分类型的服务器系统,而且流媒体服务只是DSS的几个功能模块,其强大之处在于其整体框架与架构设计上,闲话少说,让我们直入主题: 设备接入服务:在大部分...

ffmpeg文档24-协议

24 协议 FFmpeg协议配置元素,用于访问资源时要求特定的协议。 默认编译时会自动支持所有可用协议。你可以在编译脚本中添加 "–list-protocols"选项来了解有哪些协议被支持。 你也可以在编译时通过 "–disable-protocols"禁止所有的协议支持,然后通过 "–enable-protocol=PROTOCOL"来启用个别协议,或...