Windows 環境下高併發訪問 MySQL 時,常遇到「10055: No buffer space available」或「10048: Address already in use」錯誤。根因在於 TCP/IP 協議棧的 TIME_WAIT 狀態堆積與動態端口耗盡。本文提供註冊表與端口範圍雙重優化方案。
預設 TcpTimedWaitDelay 為 240 秒(4 分鐘),高併發下大量連接滯留在 TIME_WAIT,耗盡端口資源。
regeditHKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\ParametersTcpTimedWaitDelay,新建 DWORD (32-bit) 值,命名為 TcpTimedWaitDelay30(十進制),單位秒,即縮短至 30 秒預設動態端口 49152–65535(約 1.6 萬),高併發極易耗盡。擴展至 10000–59999(5 萬端口)。
以管理員身份執行 CMD,依次執行:
netsh int ipv4 set dynamicport tcp start=10000 num=50000
netsh int ipv4 set dynamicport udp start=10000 num=50000
netsh int ipv6 set dynamicport tcp start=10000 num=50000
netsh int ipv6 set dynamicport udp start=10000 num=50000
保存為 fix_tcp_timeout.bat,右鍵「以管理員身份執行」:
@echo off & setlocal enabledelayedexpansion
echo TcpTimedWaitDelay 30
reg add "HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\Tcpip\Parameters" /v "TcpTimedWaitDelay" /t REG_DWORD /d 30 /f
echo ipv4 tcp
netsh int ipv4 set dynamicport tcp start=10000 num=50000
echo ipv4 udp
netsh int ipv4 set dynamicport udp start=10000 num=50000
echo ipv6 tcp
netsh int ipv6 set dynamicport tcp start=10000 num=50000
echo ipv6 udp
netsh int ipv6 set dynamicport udp start=10000 num=50000
pause
netstat -an | find "TIME_WAIT" 觀察數量下降maxActive、maxWait 合理設定,避免連接洩漏wait_timeout 配合調整,減少空閒連接佔用系統級 + 應用級雙管齊下,徹底解決高併發下的端口耗盡與超時問題。