windows下Jmeter壓測端口占用問題
1 前情提要
人臉識別項目中,云平臺新增了人臉識別的校驗接口苹丸∨阢澹考慮到存在大量用戶并發(fā)使用人臉識別功能登錄的情況,需要對涉及到的接口進行壓力測試(后續(xù)簡稱壓測)课梳,來確保上線后的系統(tǒng)質量更穩(wěn)定距辆。
2 壓測環(huán)境配置
壓測發(fā)起設備:windows 10
網絡:局域網
壓測軟件:Jmeter 5.0
壓測系統(tǒng)內存:Ubuntu 4核8G
PHP 版本:php7.1.23
Nginx 版本:nginx1.14.0
MySQL版本:5.7.24
Redis: 開啟
CDN:關閉
3 報錯信息描述
壓測的初期,在設置了 150qps/s 的并發(fā)數下壓測幾分鐘后 Jmeter
就出現了如下報錯惦界。
JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT
4 問題排查
開始考慮的方向是Nginx挑格、PHP、MySQL做了相關限制導致線程被占用沾歪, 但是修改對應的配置后發(fā)現沒有任何效果,該報錯的還是報錯雾消。 查了一波資料灾搏,發(fā)現 windows 環(huán)境下的端口循環(huán)回收需要消耗2~4分鐘。由此猜測可能是由于 windows下壓測端口數有限立润,端口資源被占滿狂窑,沒有及時循環(huán)回收,導致報錯桑腮。
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 并發(fā)數進行壓測剪决,暫時解決了端口占用的問題。在此基礎上辆沦,將壓測的并發(fā)數提高至 700qps/s昼捍,兩分鐘內達到 66000+
個請求,數量超過了 65534
端口數肢扯,再次出現了同一報錯妒茬。
擴大 windows 端口資源數量, 能夠支持 150qps/s 并發(fā)數的壓測蔚晨。 但是在高并發(fā)數(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 引發(fā)問題
Close_Wait
會占用一個連接,網絡可用連接小汞扎。當數量過多時季稳,可能會引起網絡性能下降,并占用系統(tǒng)非換頁內存佩捞。尤其是在有連接池的情況下(比如 HttpRequest
)绞幌,會耗盡連接池的網絡連接數,導致無法建立網絡連接一忱。
CLOSE_WAIT 產生原因
一般情況下是因為 TCP 連接沒有調用關閉方法莲蜘,需要應用來處理網絡鏈接關閉。
如果是Web請求帘营,經常是因為
Response
的BodyStream
沒有調用Close
票渠。舉個例子,Widnows 下使用HttpWebRequest
一定要保證GetRequestStream
和GetResponse
對象關閉芬迄,否則容易造成連接處于CLOSE_WAIT
狀態(tài)问顷。TCP的
KeepLive
功能, 操作系統(tǒng) 默認7200秒
(2小時) 自動清理一次CLOSE_WAIT
的連接禀梳,滿足不了高并發(fā)下的端口需求數杜窄。支持自定義配置。
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"
step4: 重啟windows莉钙,配置項生效。
8 總結
解決問題的關鍵
敲黑板筛谚,劃重點
- 擴大端口數量
- 提高端口使用率