windows下Jmeter壓測端口占用問題
1 報錯信息描述
壓測的初期,在設置了 150qps/s 的並發數下壓測幾分鍾后 Jmeter 就出現了如下報錯。
JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
- 1
- 2

4 問題排查
開始考慮的方向是Nginx、PHP、MySQL做了相關限制導致線程被占用, 但是修改對應的配置后發現沒有任何效果,該報錯的還是報錯。 查了一波資料,發現 windows 環境下的端口循環回收需要消耗2~4分鍾。由此猜測可能是由於 windows下壓測端口數有限,端口資源被占滿,沒有及時循環回收,導致報錯。
5 初步解決之擴大端口數量
設置 windows下最大端口數 65534,嘗試將端口資源數設置為最大,windows最大能支持65534個端口。
步驟1
使用 win + R 快捷鍵打開 cmd,輸入 regedit 命令打開注冊表
步驟2 設置 MaxUserPort 數量
2.1 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
2.2 右擊 Parameters,添加一個新的 DWORD,命名為MaxUserPort。
2.3 然后雙擊 MaxUserPort,輸入 65534,基數選擇 十進制(如果是分布式運行的話,控制機器和負載機器都需要這樣操作)。
2.4 修改配置完畢后, 需要重啟 windows 才會生效。
6 初步實踐
采用上述的解決方案之后,windows 下設置 150qps/s 並發數進行壓測,暫時解決了端口占用的問題。在此基礎上,將壓測的並發數提高至 700qps/s,兩分鍾內達到 66000+ 個請求,數量超過了 65534 端口數,再次出現了同一報錯。
擴大 windows 端口資源數量, 能夠支持 150qps/s 並發數的壓測。 但是在高並發數(700qps/s)的壓測下,即使 windows 端口資源數量設置為最大,也會出現端口占用的問題。
7 深入研究之提高端口使用率
又是一波海量搜索,定位到了兩個影響端口使用率的主要因素,具體如下。
-
windows下的端口
Time_Wait導致端口無法使用 -
windows下的端口
CLOSE_WAIT導致端口無法使用
7.1 Time_Wait 解決方案
主要思路是通過縮短
TIME_WAIT的等待時間,提高端口的使用率。
step1: 使用 win + R 快捷鍵打開 cmd,輸入 regedit 命令打開注冊表。
step2: 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
step3: 右擊 parameters,添加一個新的DWORD,命名為 TcpTimedWaitDelay,將值設置為30, 縮短 TIME_WAIT 的等待時間。
step4: 重啟windows,配置項生效。
7.2 CLOSE_WAIT
CLOSE_WAIT 引發問題
Close_Wait 會占用一個連接,網絡可用連接小。當數量過多時,可能會引起網絡性能下降,並占用系統非換頁內存。尤其是在有連接池的情況下(比如 HttpRequest),會耗盡連接池的網絡連接數,導致無法建立網絡連接。
CLOSE_WAIT 產生原因
-
一般情況下是因為 TCP 連接沒有調用關閉方法,需要應用來處理網絡鏈接關閉。
-
如果是Web請求,經常是因為
Response的BodyStream沒有調用Close。舉個例子,Widnows 下使用HttpWebRequest一定要保證GetRequestStream和GetResponse對象關閉,否則容易造成連接處於CLOSE_WAIT狀態。 -
TCP的
KeepLive功能, 操作系統 默認7200秒(2小時) 自動清理一次CLOSE_WAIT的連接,滿足不了高並發下的端口需求數。支持自定義配置。
CLOSE_WAIT 解決方案
step1: 使用 win + R 快捷鍵打開 cmd,輸入 regedit 命令打開注冊表。
step2: 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
step3: 在該目錄下添加新的配置項。設置合理的Keepalive參數。
"KeepAliveTime"=dword:006ddd00 "KeepAliveInterval"=dword:000003e8 "MaxDataRetries"="5"
- 1
- 2
- 3
- 4
- 5
step4: 重啟windows,配置項生效。
8 總結
解決問題的關鍵
敲黑板,划重點
- 擴大端口數量
- 提高端口使用率
