單機最大的TCP連線數及其修改

zztfj發表於2013-08-20

                                                                                        單機最大的TCP連線數及其修改
一個誤解: 單個伺服器程式可承受最大連線數“理論”上是“65535” .

   65535這個數字的由來,很多人想當然地將它與port最大值聯絡起來。的確,TCP的埠數,最大值確實為65535。但是,這並不代表一個伺服器可以接受的連線數就是這個值。很多人之所以把這兩個概念搞混淆是因為對socket和port沒有更深的認識和理解。我們先來回想一下伺服器服務的先後過程:
1、伺服器建立監聽socket
2、與對外服務的埠號繫結
3、開始listen
4、客戶端連線到伺服器對應的port
5、伺服器accept為新的客戶端產生新的socket
6、基於這個新的socket與客戶端交換資料。
從以上流程來看,最大值為65535的“埠號”這個重要的東東,我們只用了一次,就是執行bind的時候!而以後建立的socket,說白了就是一個可以進行網路IO操作的HANDLE而已。通過檢視該HANDLE的RemoteEndPoint能檢視到遠端客戶端連線的IP和埠號(注意,該埠是遠端客戶端的埠),檢視該HANDLE的LocalEndPoint能看到該Socket的Ip和埠就是該服務繫結的IP和埠。所以,accept的socket值與埠號無關,又何來65535的“理論”上限?

好了,已經弄明白了伺服器端接收的客戶端連線連線數不受最大埠號65535的限制。但是,在客戶端,應用程式最多可以建立多少個TCP連線呢?以及如何調整系統引數來調整單機的最大TCP連線數。

Windows 下單機的TCP連線數有多個引數共同決定,下面一一介紹:

最大TCP連線數
[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
TcpNumConnections = 0x00fffffe (Default = 16,777,214)

 

以上登錄檔資訊配置單機的最大允許的TCP連線數,預設為 16M。這個數值看似很大,這個並不是限制最大連線數的唯一條件,還有其他條件會限制到TCP 連線的最大連線數。

最大動態埠數
TCP客戶端和伺服器連線時,客戶端必須分配一個動態埠,預設情況下這個動態埠的分配範圍為 1024-5000 ,也就是說預設情況下,客戶端最多可以同時發起3977 個Socket 連線。我們可以修改如下注冊表來調整這個動態埠的範圍

[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)

 

最大TCB 數量
系統為每個TCP 連線分配一個TCP 控制塊(TCP control block or TCB),這個控制塊用於快取TCP連線的一些引數,每個TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就說,每個TCP連線會佔用 1KB 的系統記憶體。

系統的最大TCB數量由如下注冊表設定決定

[HKEY_LOCAL_MACHINE \System \CurrentControlSet \Services \Tcpip \Parameters]
MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)

非Server版本,MaxFreeTcbs 的預設值為1000 (64M 以上實體記憶體)

Server 版本,這個的預設值為 2000。

也就是說,預設情況下,Server 版本最多同時可以建立並保持2000個TCP 連線。

最大TCB Hash table 數量
TCB 是通過Hash table 來管理的,下面登錄檔設定決定了這個Hash table 的大小

HKEY_LOCAL_MACHINE \System \CurrentControlSet \services \Tcpip \Parameters]
MaxHashTableSize = 512 (Default = 512, Range = 64-65536)

這個值指明分配 pagepool 記憶體的數量,也就是說,如果MaxFreeTcbs = 1000 , 則 pagepool 的記憶體數量為 500KB

那麼 MaxHashTableSize 應大於 500 才行。這個數量越大,則Hash table 的冗餘度就越高,每次分配和查詢 TCP  連線用時就越少。這個值必須是2的冪,且最大為65536.

 

IBM WebSphere Voice Server 在windows server 2003 下的典型配置
這是IBM WebSphere Voice Server 的典型配置,大家可以做個參考。原文參見

IBM Web Sphere Voice Server 配置

 

•MaxUserPort = 65534 (Decimal)
•MaxHashTableSize = 65536 (Decimal)
•MaxFreeTcbs = 16000 (Decimal)
這裡我們可以看到 MaxHashTableSize 被配置為比MaxFreeTcbs 大4倍,這樣可以大大增加TCP建立的速度。


 

相關文章