Can't connect to MySQL server on 'XXXX' (10055) 解決方案

最近做一個服務器端項目,要用到MySQL 數據庫,但在大用戶量併發的情況下會出現以下錯誤:

       Can't connect to MySQL server on'localhost' (10055) 

       花了半天時間查找資料得以解決,現做一下總結,希望能幫到大家,有講的不對的地方,歡迎指正,大牛勿噴。

 

錯誤的背景如下:

      系統:Windows Server 2008 R2

  數據庫:MySql 5.5

  錯誤現象:錯誤是一陣一陣的出現,一會正常,一會不正常

 

經過一番掙扎驗證,發現將數據庫放在普通的Win7 系統上不會出現該錯誤,所以應該可以排除這種代碼層面的原因,也可以排除是MySQL 配置方面的原因。那到底是什麼原因呢?經查資料得到下面這篇文章,

http://blog.whitesites.com/How-to-Fix-MySQL-Error-10055__635140180116307813_blog.htm

大家應該都能看懂,大體意思是應用程序頻繁的連接訪問數據庫,而系統會爲每個連接動態分配一個端口,Windows Server 2008 R2默認可供動態分配使用的端口只有16383 (49152 - 65535)個,(博主寫成了16838,當然這是書寫錯誤,瑕不掩瑜啊),這樣的話,大併發的情況下就會導致動態端口占用完的情況,這是有人會問我的客戶併發量並沒有達到16383,爲什麼還會出現這種情況?那就涉及到端口重用問題,每個動態分配的端口號在連接關閉後,需要等待一段時間才能重新使用,這個時間是可以改變的,具體做法稍後介紹。分析到這,這個問題應該是可以解決了,具體解決辦法有兩個:

 

1.      改變可用動態端口範圍

在修改之前我們可以查看一下默認到底是多少:

netsh int ipv4 show dynamicport tcp

netsh int ipv4 show dynamicport udp

netsh int ipv6 show dynamicport tcp

netsh int ipv6 show dynamicport udp

然後可以通過以下命令來配置:

netsh int <ipv4|ipv6> set dynamic <tcp|udp>start=number num=range

例如:

netsh int ipv4 set dynamicport tcp start=10000 num=50000

netsh int ipv4set dynamicport udp start=10000 num=50000

netsh int ipv6set dynamicport tcp start=10000 num=50000

netsh int ipv6set dynamicport udp start=10000 num=50000

 

到此或許我們就有個疑問,我麼可以設置的起始端口是多少,最大可以設置多少個端口,官方說明如下:

The minimum range of ports that can be set is 255. Theminimum starting port that can be set is 1025. The maximum end port (based onthe range being configured) cannot exceed 65535。

也就是說 start的最小值是1025,num指的是範圍,最小值是255,最大值及start + num < 65535.

 

   官方原文鏈接地址:

http://support.microsoft.com/kb/929851/en-us

有時候可能需要配置動態端口最大值:

因爲官方如下描述:

If youtry to set up TCP connections from ports that are greater than 5000, the localcomputer responds with the following WSAENOBUFS (10055) error message:

An operation on a socket could not be performed because thesystem lacked sufficient buffer space or because a queue was full.

就是說當TCP鏈接大於5000時,就會報10055錯誤。

 

通過註冊表配置動態分配端口的最大值:

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters里加上如下的鍵值:

ValueName: MaxUserPort

ValueType: DWORD

Valuedata: 65534

ValidRange: 5000-65534 (decimal)

Default:0x1388 (5000 decimal)

  官方原文鏈接地址:

http://support.microsoft.com/kb/196271/en-us

 

2.      設置端口複用時間:

 

可以通過修改或添加如下註冊表字段來配置:

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters加上

鍵值:TcpTimedWaitDelay

數值類型:REG_DWORD - 時間(以秒爲單位)

有效範圍:30-300(十進制)

默認值:0x78(十進制 120)

描述:此參數確定連接在關閉時保持 TIME_WAIT 狀態的時長。只要連接處於 TIME_WAIT 狀態,便不能重新使用套接字對。

爲了複用的快一些:可以設置爲最小值:30

 

官方文檔:

http://support.microsoft.com/kb/314053


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章