https://blog.csdn.net/weixin_43757847/article/details/88188091
1 前情提要人臉識別項目中,雲平台新增了人臉識別的校驗接口。考慮到存在大量用戶並發使用人臉識別功能登錄的情況,需要對涉及到的接口進行壓力測試(后續簡稱壓測),來確保上線后的系統質量更穩定。
2 壓測環境配置壓測發起設備:windows 10網絡:局域網壓測軟件:Jmeter 5.0壓測系統內存:Ubuntu 4核8GPHP 版本:php7.1.23Nginx 版本:nginx1.14.0MySQL版本:5.7.24Redis: 開啟CDN:關閉
3 報錯信息描述壓測的初期,在設置了 150qps/s 的並發數下壓測幾分鍾后 Jmeter 就出現了如下報錯。
JAVA.NET.BINDEXCEPTION: ADDRESS ALREADY IN USE: CONNECT12
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_WAITCLOSE_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"12345step4: 重啟windows,配置項生效。
8 總結解決問題的關鍵敲黑板,划重點
擴大端口數量提高端口使用率至此,windows下使用 Jmeter 壓測 出現的"ADDRESS ALREADY IN USE: CONNECT"的問題得以解決,完結散花。 ———————————————— 版權聲明:本文為CSDN博主「Codeages」的原創文章,遵循CC 4.0 by-sa版權協議,轉載請附上原文出處鏈接及本聲明。原文鏈接:https://blog.csdn.net/weixin_43757847/article/details/88188091