今天正好有80Gbps的万兆网络环境,写了一个压力测试工具,对比了一下各种流媒体服务器,在超级并发下的性能如何,原来听说intel的万兆网卡有问题,只能跑到不到的理论带宽,这点我测试过了,用intel最新的驱动,centos6,最次能跑到80%的理论带宽,最高能跑到95%以上,完全没有问题,需要注意的是nginx
采用异步架构,因为rtmp协议实际上损失了部分性能,实际上http的性能比这个更高。http跑到过72Gbps,带宽的90%。
nginx-rtmp做edge的配置:
- rtmp {
- server {
- listen 1935;
- application edge{
- live on;
- pull rtmp://127.0.0.1:2935/live;
- }
- }
- }
也就是说,源站的播放地址是:rtmp://192.168.1.50:2935/live/livestream,而边缘的播放地址是:rtmp://192.168.1.50:1935/edge/livestream
Wowza2的配置:
- 修改:/usr/local/WowzaMediaServer/bin/startup.sh
- 多分配内存,否则无法支持8k连接:-Xms2024m -Xmx6048m
- 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 - 修改Ping超时设置:
- /usr/local/WowzaMediaServer/conf/live/Application.xml
- <ApplicationTimeout>60000000</ApplicationTimeout>
- <PingTimeout>12000000</PingTimeout>
Wowza3的配置:
- 修改:/usr/local/WowzaMediaServer/bin/startup.sh
- 多分配内存,否则无法支持8k连接:-Xms2024m -Xmx6048m
- $_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 - 修改Ping超时设置:
- /usr/local/WowzaMediaServer/conf/live/Application.xml
- <ApplicationTimeout>60000000</ApplicationTimeout>
- <PingTimeout>12000000</PingTimeout>
测试数据如下。
Test 5k Clients
5.5k的数据如下:
Wowza2 | Wowza3 | SmartServer | NginxRtmp(Origin) | NginxRtmp(Edge) | |
CPU | 663.9% | 1247.5% | 494% | 310% | 425% |
Mem | 1GB | 6.7GB | 118MB | 216MB | 244MB |
Load | 3.99 | 26.53 | 4.06 | 3.33 | 4.77 |
Process | 1 | 1 | 8 | 8 | 8 |
Threads | 242 | 242 | 8 | 8 | 8 |
Bandwidth Required | 4.68Gbps | 4.68Gbps | 4.68Gbps | 4.68Gbps | 4.68Gbps |
Bandwidth Actual | 4.14Gbps | 4.2Gbps | 4.5Gbps | 4.9Gbps | 4.9Gbps |
Connections | 5168 | 5203 | 5201 | 5204 | 5202 |
Client-Load | 5.68 | 26.53 | 3.70 | 7.74 | 10.94 |
FlashPlay(Win7) delay | 7s | -s | 1.2s | 3s | 1s |
Architecture | java, 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连接的数据如下:
Wowza2 | Wowza3 | SmartServer | NginxRtmp(Origin) | NginxRtmp(Edge) | |
CPU | 811.6% | 1472.3% | 813.7% | 488% | 575% |
Mem | 5GB | 10GB | 188MB | 254MB | 307MB |
Load | 5.55 | 29.16 | 7.18 | 5.53 | 5.08 |
Process | 1 | 1 | 12 | 8 | 8 |
Threads | 242 | 242 | 12 | 8 | 8 |
Bandwidth Required | 7.2Gbps | 7.2Gbps | 7.2Gbps | 7.2Gbps | 7.2Gbps |
Bandwidth Actual | 6.5Gbps | 3.6Gbps | 7.6Gbps | 7.6Gbps | 7.5Gbps |
Connections | 8003 | 8003 | 8001 | 8004 | 8002 |
Client-Load | 13.31 | 2.73 | 12.05 | 17.81 | 17.94 |
FlashPlay(Win7) delay | 14s | -s | 1s | 4s | 1.7s |
Architecture | java, 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:
Wowza2 | Wowza3 | SmartServer | NginxRtmp(Origin) | NginxRtmp(Edge) | |
CPU | 1743.1% | 不支持 | 864.7% | 487% | 378% |
Mem | 11GB | 不支持 | 1.7GB | 342MB | 378MB |
Load | 13 | 不支持 | 3.39 | 4.35 | 3.96 |
Process | 1 | 1 | 17 | 8 | 8 |
Threads | 242 | 242 | 17 | 8 | 8 |
Bandwidth Required | 10Gbps | 不支持 | 9.9Gbps | 10Gbps | 10Gbps |
Bandwidth Actual | 7.4Gbps | 不支持 | 10.1Gbps | 8.5Gbps | 8.48Gbps |
Connections | 12002 | 不支持 | 11245 | 12004 | 11960 |
Client-Load | 3 | 不支持 | 29.94 | 30.47 | 30.29 |
FlashPlay(Win7) delay | NaN (客户端 直接卡死) | 不支持 | 1.7s | 3s | 1.3s |
Architecture | java, 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),所以无法继续开更多客户端测试,服务器的负载还很低,还可以开启更多的客户端。
其他因素
除了性能之外,网络服务器需要考虑的因素包括:
Wowza2 | SmartServer | NginxRtmp | |
集群 | Origin+Edge | Edge | Origin+Edge |
主备 | 不支持 | 支持 | 不支持 |
直播转码 | 支持 | 不支持 | 支持 |
HLS | 支持 | 不支持 | 支持 |
可维护性 | 容易 | 容易 | 很难 |
监控数据 | 不支持 | 支持 | 不支持 |
HTTP接口 | 不支持 | 不支持 | 支持 |
Reload | 不支持 | 支持 | 支持 |
带宽检测 | 不支持 | 支持 | 不支持 |
极简配置 | 不支持 | 支持 | 部分支持 (Edge回源时 必须指定app) |
理论上,nginx或者st这种架构,为网络服务器的最优架构。
多进程+单线程+异步socket+HTTP===超级网络服务器(nginx)。
多进程+单线程+异步socket+Rtmp===超级RTMP服务器(nginx-rtmp/SmartServer)。