在做Socket 編程時,我們經(jīng)常會要問,單機(jī)最多可以建立多少個 TCP 連接,本文將介紹如何調(diào)整系統(tǒng)參數(shù)來調(diào)整單機(jī)的最大TCP連接數(shù)。
Windows 下單機(jī)的TCP連接數(shù)有多個參數(shù)共同決定,下面一一介紹:
l 最大TCP連接數(shù)
[HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /Tcpip /Parameters]
TcpNumConnections = 0x00fffffe (Default = 16,777,214)
以上注冊表信息配置單機(jī)的最大允許的TCP連接數(shù),默認(rèn)為 16M。這個數(shù)值看似很大,這個并不是限制最大連接數(shù)的唯一條件,還有其他條件會限制到TCP 連接的最大連接數(shù)。
l 最大動態(tài)端口數(shù)
TCP客戶端和服務(wù)器連接時,客戶端必須分配一個動態(tài)端口,默認(rèn)情況下這個動態(tài)端口的分配范圍為 1024-5000 ,也就是說默認(rèn)情況下,客戶端最多可以同時發(fā)起3977 個Socket 連接。我們可以修改如下注冊表來調(diào)整這個動態(tài)端口的范圍
[HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /Tcpip /Parameters]
MaxUserPort = 5000 (Default = 5000, Max = 65534)
l 最大TCB 數(shù)量
系統(tǒng)為每個TCP 連接分配一個TCP 控制塊(TCP control block or TCB),這個控制塊用于緩存TCP連接的一些參數(shù),每個TCB需要分配 0.5 KB的pagepool 和 0.5KB 的Non-pagepool,也就說,每個TCP連接會占用 1KB 的系統(tǒng)內(nèi)存。
系統(tǒng)的最大TCB數(shù)量由如下注冊表設(shè)置決定
[HKEY_LOCAL_MACHINE /System /CurrentControlSet /Services /Tcpip /Parameters]
MaxFreeTcbs = 2000 (Default = RAM dependent, but usual Pro = 1000, Srv=2000)
非Server版本,MaxFreeTcbs 的默認(rèn)值為1000 (64M 以上物理內(nèi)存)
Server 版本,這個的默認(rèn)值為 2000。
也就是說,默認(rèn)情況下,Server 版本最多同時可以建立并保持2000個TCP 連接。
l 最大TCB Hash table 數(shù)量
TCB 是通過Hash table 來管理的,下面注冊表設(shè)置決定了這個Hash table 的大小
HKEY_LOCAL_MACHINE /System /CurrentControlSet /services /Tcpip /Parameters]
MaxHashTableSize = 512 (Default = 512, Range = 64-65536)
這個值指明分配 pagepool 內(nèi)存的數(shù)量,也就是說,如果MaxFreeTcbs = 1000 , 則 pagepool 的內(nèi)存數(shù)量為 500KB
那么 MaxHashTableSize 應(yīng)大于 500 才行。這個數(shù)量越大,則Hash table 的冗余度就越高,每次分配和查找 TCP 連接用時就越少。這個值必須是2的冪,且最大為65536.
l 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建立的速度。