并發(fā)概念太模糊,這里以兩種可以量化的指標并發(fā)連接數和并發(fā)請求數來說明。
并發(fā)連接數是指服務器當前時刻一共維持了多少TCP連接,而這些連接上是否有數據通訊并不關注。 (推薦學習: workerman教程)
例如一臺消息推送服務器上可能維持了百萬的設備連接,由于連接上很少有數據通訊,所以這臺服務器上負載可能幾乎為0,只要內存足夠,還可以繼續(xù)接受連接。
并發(fā)請求數一般用QPS(服務器每秒處理多少請求)來衡量,而當前時刻服務器上有多少個tcp連接并不十分關注。例如一臺服務器只有10個客戶端連接,每個客戶端連接上每秒有1W個請求,那么要求服務端需要至少能支撐10*1W=10W每秒的吞吐量(QPS)。
假設10W吞吐量每秒是這臺服務器的極限,如果每個客戶端每秒發(fā)送1個請求給服務端,那么這臺服務器能夠支撐10W個客戶端。
并發(fā)連接數受限于服務器內存,一般24G內存workerman服務器可以支持大概120W并發(fā)連接。
并發(fā)請求數受限于服務器cpu處理能力,一臺24核workerman服務器可以達到45W每秒的吞吐量(QPS),實際值根據業(yè)務復雜度以及代碼質量有所變化。
注意
高并發(fā)場景必須安裝event或者libevent擴展。另外需要優(yōu)化linux內核,尤其是進程打開文件數限制。
壓測數據
這里僅提供workerman壓測的QPS數據參考。
###測試環(huán)境:
系統(tǒng):debian 6.0 64位
內存:64G
cpu:Intel(R) Xeon(R) CPU E5-2420 0 @ 1.90GHz (2顆物理cpu,6核心,2線程)
Workerman:開啟200個Benchark進程
壓測腳本:benchmark
業(yè)務:發(fā)送并返回hello字符串
###普通PHP(版本5.3.10)壓測
短連接(每次請求完成后關閉連接,下次請求建立新的連接):
條件: 壓測腳本開500個并發(fā)線程模擬500個并發(fā)用戶,每個線程連接Workerman 10W次,每次連接發(fā)送1個請求
結果: 吞吐量:2.3W/S , cpu利用率:36%
長連接(每次請求后不關閉連接,下次請求繼續(xù)復用這個連接):
條件: 壓測腳本開2000個并發(fā)線程模擬2000個并發(fā)用戶,每個線程連接Workerman 1次,每個連接發(fā)送10W請求
結果: 吞吐量:36.7W/S , cpu利用率:69%
內存:每個進程內存穩(wěn)定在6444K,無內存泄漏
以上是php5.3版本壓測數據,如果用php7,性能會再次提升40%左右。
###HHVM環(huán)境壓測
短連接(每次請求完成后關閉連接,下次請求建立新的連接):
條件: 壓測腳本開1000個并發(fā)線程模擬1000個并發(fā)用戶,每個線程連接Workerman 10W次,每次連接發(fā)送1個請求
結果: 吞吐量:3.5W/S , cpu利用率:35%
長連接(每次請求后不關閉連接,下次請求繼續(xù)復用這個連接):
條件: 壓測腳本開6000個并發(fā)線程模擬6000個并發(fā)用戶,每個線程連接Workerman 1次,每個連接發(fā)送10W請求
結果: 吞吐量:45W/S , cpu利用率:67%
內存:HHVM環(huán)境每個進程內存穩(wěn)定在46M,無內存泄漏