在做Socket 編程時,我們經常會要問,單機最多可以建立多少個 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建立的速度。
eaglet 其他的作業系統相關的文章