socket最大連接數



https://blog.csdn.net/tgxallen/article/details/54947523

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建立的速度。


http://www.zhihu.com/question/30772664

單個連接消耗內存的地方.

第一個首先是socket buffer. read 和write 分別有一個, 默認大小在
  • /proc/sys/net/ipv4/tcp_rmem (for read)
  • /proc/sys/net/ipv4/tcp_wmem (for write)
默認大小都是87K和16K, 最低是4K和4K, 最高是2M,2M, 實際使用默認值最低也要保留8K,8K.

然後是邏輯IO緩衝區
就是比如你監聽了recv事件 事件來了 你要有內存可用(一般都是socket建立起就分配好,斷開纔會釋放的).
這個內存是自己寫socket程序時候自己控制的, 最低也要4K,4K, 實際使用8K,8K至少.

現在設定一個優化方案和使用場景, 首先假設4G內存全部爲空閒(系統和其他進程也要內存的....

假如網絡包的大小都可以控制在4K以下, 假設所有連接的網絡都不會擁堵, 或者擁堵時候的總量在4K以下:
一個連接的內存消耗是4+4+4+4=16K
4G/16K=26.2萬併發

假如網絡包的大小都可以控制在8K以下, 假設所有連接的網絡都不會擁堵, 或者擁堵時候的總量在8K以下
一個socket的內存佔用介於 24K ~ 32K之間, 保守的按照32K算
4G/32K=13.1萬併發, 這個在生產環境作爲一個純網絡層面的內存消耗, 是可以作爲參考的.

假如使用默認配置, 假如所有連接的網絡都出現嚴重擁堵, 不考慮邏輯上的發送隊列的佔用,
使用默認配置是2M+2M+8+8 ~= 4M
4G/4M=1024併發 ( ...
如果考慮到發送隊列也擁堵的話 自己腦補.


如果只是爲了跑分 爲了併發而優化, 沒有常駐的邏輯緩衝區 並且socket的網絡吞吐量很小並且負載平滑, 把socket buffer size設置系統最低.
那麼是
4G/8K = 52.4萬併發 這個應該是極限值了.
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章