單機併發連線數研究

rezy發表於2016-05-30

系統用一個4四元組來唯一標識一個TCP連線:{local ip, local port,remote ip,remote port}。

 
client每次發起tcp連線請求時,除非繫結埠,通常會讓系統選取一個空閒的本地埠(local port),該埠是獨佔的,不能和其他tcp連線共享。tcp埠的資料型別是unsigned short,因此本地埠個數最大隻有65536,埠0有特殊含義,不能使用,這樣可用埠最多隻有65535,所以在全部作為client端的情況下,最大tcp連線數為65535,這些連線可以連到不同的server ip。
 
server通常固定在某個本地埠上監聽,等待client的連線請求。不考慮地址重用(unix的SO_REUSEADDR選項)的情況下,即使server端有多個ip,本地監聽埠也是獨佔的,因此server端tcp連線4元組中只有remote ip(也就是client ip)和remote port(客戶端port)是可變的,因此最大tcp連線為客戶端ip數×客戶端port數,對IPV4,不考慮ip地址分類等因素,最大tcp連線數約為2的32次方(ip數)×2的16次方(port數),也就是server端單機最大tcp連線數約為2的48次方。
 
在unix/linux下限制連線數的主要因素是記憶體和允許的檔案描述符個數(每個tcp連線都要佔用一定記憶體,每個socket就是一個檔案描述符), 另外1024以下的埠通常為保留埠。對server端,通過增加記憶體、修改最大檔案描述符個數等引數,單機最大併發TCP連線數超過10萬 是沒問題的。
 
注意事項:
1.預設的CONNTRACK_MAX值不會低於128
2.對於帶有超過1G記憶體的系統,CONNTRACK_MAX的預設值會被限制在65536(但是可以手工設定成更大的值)
3.預設HASHSIZE的值不會小於16
4.對於帶有超過1G記憶體的系統,HASHSIZE的預設值會被限制在8192(但是可以手工設定成更大的值)
 
總結
1.每個連線都要耗費一定的資源,比如CPU、MEM,所以,真實值往往很難達到理論值;
2.根據協議的不同,能達到的最大連線數也不一樣,比如HTTP/1.0連線的建立和關閉都非常快,而且瀏覽器對併發連線數有限制,所以,很難達到最大的理論值。HTTP/1.1支援流線技術,多個請求可以複用一個連線,這樣就大大減少了併發連線數。FTP或者telnet連線都是長連線,很容易達到最大值。
3.很多裝置(比如NetScaler)在伺服器端都支援連線池(連線複用),裡面的連線都是長連線,一樣實現了HTTP/1.1裡面的流線技術,一個連線就可以處理多個客戶端連線。這樣除了減少連線資源,同時還減少了負載均衡器的其他資源開銷,同時減低了內網的頻寬。
4.一些裝置(比如NetScaler的TCP-OFFLOAD)支援TCP解除安裝,僅僅把已經建立的連線發到伺服器端,而TCP的三次握手完全有負載均衡器接管,這樣,伺服器端的連線就成倍的減少。
 
資料來源:
1.http://wanshi.iteye.com/blog/1256282
2.http://hi.baidu.com/hawk418/blog/item/8377b86e8fe7b3c081cb4a84.html

3.http://itfun.blog.sohu.com/212057666.html

 

單機千萬併發連線實戰

http://www.2cto.com/kf/201508/437814.html

相關文章