写在前面:最近公司有个相关的项目要用到80G的的万兆网络环境,正好公司的大牛搞个st的东东,写了一个压力测试工具,对比了一下各种流媒体服务,FMS没有包含在内,比较遗憾,不过已经比较全面了。原来听说intel的万兆网卡有问题,只能跑到不到的理论带宽,这点我测试过了,用intel最新的驱动,centos6,最次能跑到80%的理论带宽,最高能跑到95%以上,完全没有问题。没有做任何优化,这个以后我单发贴子吧。原来对Wowza影响很好,单经过这次测试彻底无语了,可能专注的点不同吧,wowza3还不如wowza2,很失望,先转这个测试的报告大家看看吧。


给某CDN公司做了一个rtmp服务器,使用state-threads(该公司首席架构师micheal定的框架),今天正好有80Gbps的万兆网络环境,就测了一下服务器在超级并发下的性能如何。

st在架构上,和nginx的异步架构是同源的,因为rtmp协议实际上损失了部分性能,实际上http的性能比这个更高。http跑到过72Gbps,带宽的90%。

手头只有wowza2的license,不过wowza2就传说能到10Gbps,我很怀疑,所以对比了一下。

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)。