TIME_WAIT 導緻 Address already in use : connect 異常的解決辦法
在使用java作為http用戶端進行壓力測試的時候,尤其是在多線程環境下當用戶端連續建立連接配接一段時間後極容易出現端口占用的異常情況:Address already in use : connect ......
netstat -aux 檢視會有一大堆狀态為 TIME_WAIT 的連接配接
問題原因: Java的 Socket.close() 并不能立即釋放連接配接,會造成一段時間内 TIME_WAIT 狀态。同時作業系統可供使用的連接配接數有預設限制,很快會被占滿 。
(如果你通路的伺服器端也部署在本機那麼你可能需要用其他機器來做壓力測試,本機連本機極容易發生端口占用,即使通過系統資料庫修改了連結釋放時間)
(最後注意自己的http請求是否帶有keepalived參數)
網上的解決方法如下:
修改作業系統系統資料庫
1. 打開系統資料庫:regedit
2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCP\Parameters
3. 建立 DWORD值,name:TcpTimedWaitDe,value:30(十進制) –> 設定為30秒,預設是240
4. 建立 DWORD值,name:MaxUserPort,value:65534(十進制) –> 設定最大連接配接數65534
5. 重新開機系統