1. 程式人生 > >限制連線數上漲的幾個關鍵因素

限制連線數上漲的幾個關鍵因素

系統埠限制

Linux系統埠為short型別表示,數值上限為65535。假設分配壓測業務可用埠範圍為1024 - 65535(1024以下系統預留),不考慮可能還執行著其它對外連線的服務,真正可用埠也就是64000左右(實際上,一般為了方便計算,一般直接設定為50000)。換言之,即在一臺機器上一個IP,可用同時對外建立64000網路連線。

若是N個可用IP,理論上 64000*N,實際上還需要滿足:

  • 充足記憶體支援
  1. tcp接收/傳送緩衝區不要設定太大,tsung預設分配32K(可以修改成16K,一般夠用了)
  2. 一個粗略估算假設一個使用者佔用記憶體50k1w使用者佔用500M記憶體,假設需要100w

100w/6w = 17IP地址 500m * 100w/1024 = 50G記憶體 伺服器單一IP 承載100萬用戶1臺主機+17臺從機 若單機64G記憶體+17IP可用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系統設定接收、傳送緩衝大小。

粗略的預設值計算,一個網路連線傳送緩衝區 + 接收緩衝區,再加上程序處理連線堆疊佔用,約40K記憶體,為即計算方便,設定建立一個網路連線消費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連線。