限制連線數上漲的幾個關鍵因素
系統埠限制
Linux系統埠為short型別表示,數值上限為65535。假設分配壓測業務可用埠範圍為1024 - 65535(1024以下系統預留),不考慮可能還執行著其它對外連線的服務,真正可用埠也就是64000左右(實際上,一般為了方便計算,一般直接設定為50000)。換言之,即在一臺機器上一個IP,可用同時對外建立64000網路連線。
若是N個可用IP,理論上 64000*N,實際上還需要滿足:
- 充足記憶體支援
- tcp接收/傳送緩衝區不要設定太大,tsung預設分配32K(可以修改成16K,一般夠用了)
- 一個粗略估算假設一個使用者佔用記憶體50k,1w使用者佔用500M記憶體,假設需要100w用
100w/6w = 17個IP地址 ;500m * 100w/1024 = 50G記憶體 ;伺服器單一IP 承載100萬用戶:1臺主機+17臺從機 ;若單機64G記憶體+17個IP可用IP地址 就一臺就能搞定。
- 為多IP的壓測端分配適合的權重,以便承擔更多的終端連線
Linux系統開啟檔案控制代碼限制
系統開啟檔案控制代碼,直接決定了可以同時開啟的網路連線數量,這個需要設定大一些,否則,你可能會在[email protected]檔案中看到error_connect_emfile類似檔案控制代碼不夠使用的警告,建議此值要大於 > N * 64000。
修改linux系統引數。vi /etc/security/limits.conf 新增
* soft nofile 655350
* hard nofile 655350
* soft nproc 655350
* hard nproc 655350
修改以後儲存,登出當前使用者,重新登入,執行ulimit -a ,ok ,引數生效了:
注:nofile是代表最大檔案開啟數,nproc是作業系統級別對每個使用者建立的程序數的限制
記憶體的影響:
一個網路Socket連線佔用不多,但上萬個或數十萬等就不容小覷了,設定不當會導致記憶體直接成為屏障。
TCP接收、傳送快取
Tsung預設設定的網路Socket傳送接收緩衝區為16KB,一般夠用了。
[[email protected] ~]# cat /proc/sys/net/ipv4/tcp_rmem 4096 87380 4194304
此值會覆蓋Linux系統設定接收、傳送緩衝大小。
粗略的預設值計算,一個網路連線傳送緩衝區 + 接收緩衝區,再加上程序處理連線堆疊佔用,約40多K記憶體,為即計算方便,設定建立一個網路連線消費50K記憶體。
先不考慮其它因素,若我們想要從機模擬10W個使用者,那麼當前可用記憶體至少要剩餘:50K * 100000 / 1000K = 5000M = 5G記憶體。針對一般伺服器來講,完全可滿足要求(剩下事情就是要有兩個可用IP了)。
伺服器檢視TCP連線數
命令:
ss -tan|awk 'NR>1{++S[$1]}END{for (a in S) print a,S[a]}’
通過上述命令可以統計出TCP連線中處於各個狀態的連線數,在經過Ng代理之後需要真實的連線數需要除以2,因為Client——Nginx——Mqtt其實算是兩個TCP連線。