首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

MySQL 連線數耗盡報 10055 錯誤?排查 IIS、SMTP、TCP/IP 連線洩漏

     編輯:MySQL 資料庫相關知識

現象:MySQL 拒絕新連線,錯誤 10055 (WSAENOBUFS)

應用突發 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

實戰解決案例

  1. 發信程式併發過高:netstat -na > a.xls 發現 25 端口連線 4000+。開發將單 IP 併發上限從 10 降至 5,連線數降至 2300,問題緩解。
  2. IIS 連線/會話超時過長:預設連線超時 120s、會話超時 20 分鐘。調整為:
    • IIS → 網站 → 進階設置 → 連線限制 → 連線超時:60 秒。
    • IIS → 網站 → ASP → 會話屬性 → 會話超時:2 分鐘。
  3. 應用層連線池洩漏:代碼未在 finally / using 區塊關閉連線,導致連線池耗盡。強制代碼審查、啟用連線池監控(Performance Counters → .NET Data Provider for SqlServer/MySql → NumberOfActiveConnections)。

系統層優化(Windows Server 2008+)

# 擴大動態埠範圍(預設 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

監控與告警

  • Zabbix/Prometheus 監控 netstat -an | findstr /c:"ESTABLISHED" /c:"TIME_WAIT" | find /c /v "" 連線總數,超過閾值(如 8000)告警。
  • MySQL 端 SHOW GLOBAL STATUS LIKE 'Threads_connected'; 監控當前線程數,配合 max_connections 告警。

10055 錯誤本質是**系統 TCP 資源耗盡**,而非 MySQL 本身故障。從應用連線池、IIS 超時、外部服務併發、TCP 參數四個維度系統性治理,才能徹底根治。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved