伺服器: windows2000 server + iis5.0 + php isapi + mysql
我用php+mysql開發了一個web站,該站訪問量很高。
但是正常運行了一個多星期以後,開始頻繁出現Can't connect
to MySQL server on 'localhost' (10048) 錯誤。
統計資料如下:
嘗試失敗連結數 10,594
每小時總連結數 885.37
%
15.91 %
可以看出,串連失敗的比率非常高了。需要強調的是,一周之前,同樣的連結數,並沒有出現如此高的錯誤率。
原因分析:利用fport工具查看,你會發現有人在耗盡你的資料庫連接。而很明顯他們的特徵是:有數十個串連來自同一IP,而且都是time-wait
解決方案,1。建議修改最大串連數,或者把 mysql_connect() 方法都改成了 mysql_pconnect() 方法,
2。治標,封鎖這些IP,一個IP串連大於3的就有點不正常,封
3,治本,修改網站程式,嚴禁重新整理太快!
連結數的修改:
此錯誤與一個註冊表索引值TcpTimedWaitDelay有關。減小Windows中
TcpTimedWaitDelay時間可解決此類問題,預設情況下為240(未設定的情況下也是這個數值)。此項設定需要到註冊表如下位置進行設定:[HKEY_LOCAL_MACHINE]
[SYSTEM] [CurrentControlSet] [Services] [Tcpip] [Parameters]
[TcpTimedWaitDelay]如果註冊表中沒有TcpTimedWaitDelay這個項目,請增加這個項目,並設定為雙位元組(DWORD)類型。數值設定為30
~ 60 之間即可。
TcpTimedWaitDelay描述:確定 TCP/IP
可釋放已關閉串連並重用其資源前,必須經過的時間。關閉和釋放之間的此時間間隔通稱 TIME_WAIT
狀態或兩倍最大段生命週期(2MSL)狀態。此時間期間,重新開啟到客戶機和伺服器的串連的成本少於建立新串連。減少此條目的值允許 TCP/IP
更快地釋放已關閉的串連,為新串連提供更多資源。如果啟動並執行應用程式需要快速釋放和建立新串連,而且由於 TIME_WAIT
中存在很多串連,導致低輸送量,則調整此參數。 如何查看或設定: 使用 regedit 命令訪問
HKEY_LOCAL_MACHINE/SYSTEM/CurrentControlSet/ Services/TCPIP/Parameters
註冊表子鍵並建立名為 TcpTimedWaitDelay 的新 REG_DWORD 值。 將此值設定為十進位 30,其為十六進位
0×0000001e。該值將等待時間設定為 30 秒。 停止並重新啟動系統。 預設值:0xF0,它將等待時間設定為 240 秒(4 分鐘)。建議值:最小值為
0×1E,它將等待時間設定為 30 秒。
http://adamghost.com/2008/11/mysql-10055-%E9%94%99%E8%AF%AF%E8%A7%A3%E5%86%B3%E6%96%B9%E6%A1%88/?jdfwkey=gkden3