對於thrift的幾種server模型在不一樣場景下的性能表現作了一個壓測,結果僅供參考。網絡
(一)環境多線程
服務端機器:併發
24核CPU,E5-2430,2.5GHz,96GB內存性能
客戶端機器:spa
24核CPU,E5-2430,2.5GHz,64GB內存線程
網絡環境:日誌
千兆網server
thrift版本:xml
0.9.1blog
語言:
C++
服務端處理:
sleep 0.5ms,打印一條日誌
(二)不一樣server特色
每新到一個鏈接就新建一個線程處理,直到鏈接關閉線程銷燬
線程數=當前鏈接數,線程數無限制
新建線程&銷燬線程耗資源
主線程將新鏈接放入任務隊列,工做線程從任務隊列區鏈接處理,直到鏈接關閉線程再從任務隊列取鏈接
線程數=線程池size
若是線程池設置的不夠,可能致使上游等待
使用libevent
(三)壓測結果
對每種狀況併發執行500000個請求
threadpool的size:2048
nonblocking中,work線程池size:256,IO線程個數:256
qps | 線程池+長鏈接 | 線程池+短鏈接 | 多線程+長鏈接 | 多線程+短鏈接 | 非阻塞+長鏈接 | 非阻塞+短鏈接 |
4 | 5102 | 3571 | 5102 | 3521 | 5319 | 4032 |
8 | 10416 | 7352 | 10416 | 6944 | 10416 | 7352 |
16 | 20833 | 13157 | 20833 | 12500 | 19230 | 12500 |
32 | 35714 | 17857 | 35714 | 15625 | 31250 | 19230 |
64 | 35714 | 19230 | 35714 | 20833 | 35714 | 22727 |
128 | 33333 | 19230 | 35714 | 20833 | 35714 | 19230 |
256 | 27777 | 19230 | 35714 | 19230 | 41666 | 20833 |
512 | 27777 | 17857 | 27777 | 16129 | 41666 | 19230 |
1024 | 27777 | 17857 | 27777 | 16666 | 41666 | 19230 |
2048 | 27777 | 13888 | 27777 | 12820 | 50000 |
對比圖以下所示:
(四)結論
1)線程池threadpool和多線程threaded性能差異不大
2)在全部模型中,長鏈接比短鏈接性能高30%~50%,且性能最優時均在併發鏈接爲32~256時
3)在併發達到512後,只用非阻塞+長鏈接的性能逐步提高,其餘case的性能都會隨着併發的增大而下降
綜上,長鏈接時使用非阻塞方式性能最優;短鏈接時,各類模型差別不大。