今天正好有80Gbps的萬兆網絡環境,寫了一個壓力測試工具,對比了一下各類流媒體服務器,在超級併發下的性能如何,原來據說intel的萬兆網卡有問題,只能跑到不到的理論帶寬,這點我測試過了,用intel最新的驅動,centos6,最次能跑到80%的理論帶寬,最高能跑到95%以上,徹底沒有問題,須要注意的是nginx 採用異步架構,由於rtmp協議實際上損失了部分性能,實際上http的性能比這個更高。http跑到過72Gbps,帶寬的90%。java
rtmp {linux
server {nginx
listen 1935;c++
application edge{bootstrap
live on;centos
pull rtmp://127.0.0.1:2935/live;服務器
}網絡
}架構
}併發
也就是說,源站的播放地址是:rtmp://192.168.1.50:2935/live/livestream,而邊緣的播放地址是:rtmp://192.168.1.50:1935/edge/livestream
修改:/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>
修改:/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>
測試數據以下。
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就是一坨屎。
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。
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)。