Windows Socket 最大連線數
windows server 中nginx 連線數 限制1024 修改此項可以解決如下:
一、理論知識(文章來源:http://www.cnblogs.com/zwq194/archive/2012/12/14/2817673.html)
Socket 程式設計時,單機最多可以建立多少個 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 下的典型配置
MaxUserPort = 65534 (Decimal)
MaxHashTableSize = 65536 (Decimal)
MaxFreeTcbs = 16000 (Decimal)
這裡我們可以看到 MaxHashTableSize 被配置為比MaxFreeTcbs 大4倍,這樣可以大大增加TCP建立的速度。
二、個人總結
TCP/IP 協議規定的,只用了2個位元組表示埠號。容易讓人誤解為1個server只允許連線65535個Client。
typedef struct _NETWORK_ADDRESS_IP
{
USHORT sin_port;//0~65535
ULONG in_addr;
UCHAR sin_zero[8];
} NETWORK_ADDRESS_IP, *PNETWORK_ADDRESS_IP;
(1)其實65535這個數字,只是決定了伺服器端最多可以擁有65535個Bind的Socket。也就是說,最多可以開65535個伺服器程式,但是你要知道這個能夠連線客戶端的數量沒有任何關係,Accept過來的Socket是不需要Bind任何IP地址的,也沒有埠占用這一說。作為Server端的Socket本身只負責監聽和接受連線操作。
(2)TCP協議裡面是用[源IP+源Port+目的IP+目的 Port]來區別兩個不同連線,所以連入和連出是兩個不同的概念。連出Connect就不錯了,需要生成隨機埠,這個是有限的連入的話, 因SOCKET的分配受記憶體分頁限制,而連線受限制(WINDOWS)。
(3)所以,千萬不要誤以為1個server只允許連線65535個Client。記住,TCP連出受埠限制,連入僅受記憶體限制。
例如server,IP:192.168.16.254,Port:8009
Client1:IP:192.168.16.1,Port:2378
Client2:IP:192.168.16.2,Port:2378
Client1和Client2雖然Port相同,但是IP不同,所以是不同的連線。
(4)想讓1個server併發高效得連線幾萬個Client,需要使用IOCP“完成埠(Completion Port)”的技術。
詳情請參考文章:http://blog.csdn.net/libaineu2004/article/details/40087167
三、書籍推薦
《Linux多執行緒服務端程式設計:使用muduo C++網路庫》,陳碩著。
請查閱“附錄D,關於TCP併發連線的幾個思考題與試驗”。
單機最大tcp連線數
網路程式設計
在tcp應用中,server事先在某個固定埠監聽,client主動發起連線,經過三路握手後建立tcp連線。那麼對單機,其最大併發tcp連線數是多少?
如何標識一個TCP連線
在確定最大連線數之前,先來看看系統如何標識一個tcp連線。系統用一個4四元組來唯一標識一個TCP連線:{local ip, local port,remote ip,remote port}。
client最大tcp連線數
client每次發起tcp連線請求時,除非繫結埠,通常會讓系統選取一個空閒的本地埠(local port),該埠是獨佔的,不能和其他tcp連線共享。tcp埠的資料型別是unsigned short,因此本地埠個數最大隻有65536,埠0有特殊含義,不能使用,這樣可用埠最多隻有65535,所以在全部作為client端的情況下,最大tcp連線數為65535,這些連線可以連到不同的server ip。
server最大tcp連線數
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次方。
實際的tcp連線數
上面給出的是理論上的單機最大連線數,在實際環境中,受到機器資源、作業系統等的限制,特別是sever端,其最大併發tcp連線數遠不能達到理論上限。在unix/linux下限制連線數的主要因素是記憶體和允許的檔案描述符個數(每個tcp連線都要佔用一定記憶體,每個socket就是一個檔案描述符),另外1024以下的埠通常為保留埠。在預設2.6核心配置下,經過試驗,每個socket佔用記憶體在15~20k之間。
影響一個socket佔用記憶體的引數包括:
rmem_max
wmem_max
tcp_rmem
tcp_wmem
tcp_mem
grep skbuff /proc/slabinfo
對server端,通過增加記憶體、修改最大檔案描述符個數等引數,單機最大併發TCP連線數超過10萬 是沒問題的,國外 Urban Airship 公司在產品環境中已做到 50 萬併發 。在實際應用中,對大規模網路應用,還需要考慮C10K 問題。
原文:
http://wanshi.iteye.com/blog/1256282
http://www.cnblogs.com/Solstice/archive/2011/07/01/2095411.html
http://unix.stackexchange.com/questions/30509/what-is-the-formula-to-determine-how-much-memory-a-socket-consumes-under-linux
http://serverfault.com/questions/10852/what-limits-the-maximum-number-of-connections-on-a-linux-server
http://soft.chinabyte.com/os/285/12349285.shtml
相關文章
- Linux配置支援高併發TCP連線(socket最大連線數)LinuxTCP
- ubuntu linux 修改socket最大連線數,同時也是檔案最大開啟數UbuntuLinux
- MYSQL 檢視最大連線數和修改最大連線數MySql
- mysql最大連線數MySql
- 修改Windows 2003最大遠端連線數Windows
- MySQL 修改最大連線數MySql
- Jboss的最大連線數
- mysql最大連線數修改MySql
- 單機最大tcp連線數TCP
- oracle最大連線數相關Oracle
- 加大MySql的最大連線數MySql
- Socket連線和Http連線HTTP
- 測試 mysql 的最大連線數MySql
- mstsc命令遭遇超出最大連線數
- Tomcat最大連線數問題Tomcat
- EBS DB最大連線數調整
- Go Socket 連線Go
- Oracle檢視允許的最大連線數和當前連線數Oracle
- 探討.net Socket支援線上連線數量
- 詳解IIS最大併發連線數
- MySQL 預設最大連線數是多少?MySql
- activemq修改IO模型和最大連線數MQ模型
- RabbitMQ能開啟的最大連線數MQ
- 檢視並修改oracle最大連線數Oracle
- ORACLE檢視並修改最大連線數Oracle
- http Socket長連線HTTP
- oracle檢視允許的最大連線數和當前連線數等資訊Oracle
- 區分socket連線和tcp/ip連線TCP
- 單機最大的TCP連線數及其修改TCP
- windows中socket 連結繫結數過多問題Windows
- mysql關於最大連線數、最大併發執行緒數的區別MySql執行緒
- telnet連線socket serverServer
- flash無法連線socket
- 【Socket】關於socket長連線的心跳包
- Windows TCP連線數限制解決WindowsTCP
- xp sp2最大連線數更改不了
- 如何看例項的歷史最大連線數?
- 查詢oracle歷史最大連線[會話]數Oracle會話