應用突發 Can't connect to MySQL server (10055),重啟 MySQL 暫時恢復,不久再發。系統事件日誌無異常,網路通暢。經排查為**作業系統層面 TCP 連線耗盡**(Windows Socket 錯誤 10055 = No buffer space available)。
| 來源 | 典型場景 | 排查命令 |
|---|---|---|
| IIS 網站應用程式池 | 連線池未釋放、Connection Timeout/Session Timeout 過長、長連線未正確關閉 | netstat -an | findstr :3306 觀察 TIME_WAIT/ESTABLISHED 數量 |
| 其他服務(SMTP、FTP、自建服務) | 發信程式大量併發連線、未設定連線上限 | netstat -an | findstr :25 等 |
| TCP/IP 協議棧限制 | XP/Server 2003 有半開連線限制;Server 2008+ 預設動態擴展,但註冊表 TcpTimedWaitDelay/MaxUserPort 可調優 | netsh int ipv4 show dynamicport tcp |
netstat -na > a.xls 發現 25 端口連線 4000+。開發將單 IP 併發上限從 10 降至 5,連線數降至 2300,問題緩解。finally / using 區塊關閉連線,導致連線池耗盡。強制代碼審查、啟用連線池監控(Performance Counters → .NET Data Provider for SqlServer/MySql → NumberOfActiveConnections)。# 擴大動態埠範圍(預設 49152-65535)
netsh int ipv4 set dynamicport tcp start=10000 num=55535
# 縮短 TIME_WAIT 等待(預設 240 秒,註冊表需重啟)
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpTimedWaitDelay /t REG_DWORD /d 30 /f
# 啟用 TIME_WAIT 重用(需應用層支援 SO_REUSEADDR)
reg add HKLM\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters /v TcpTwReuse /t REG_DWORD /d 1 /f
netstat -an | findstr /c:"ESTABLISHED" /c:"TIME_WAIT" | find /c /v "" 連線總數,超過閾值(如 8000)告警。SHOW GLOBAL STATUS LIKE 'Threads_connected'; 監控當前線程數,配合 max_connections 告警。10055 錯誤本質是**系統 TCP 資源耗盡**,而非 MySQL 本身故障。從應用連線池、IIS 超時、外部服務併發、TCP 參數四個維度系統性治理,才能徹底根治。