【報錯資訊】
Non HTTP response code: org.apache.http.conn.ConnectTimeoutException/Non HTTP response message: Connect to IP:埠 failed: Read timed out
Non HTTP response code: java.net.SocketTimeoutException/Non HTTP response message: Read timed out
Non HTTP response code: java.net.SocketException/Non HTTP response message: Connection reset
Non HTTP response code: org.apache.http.NoHttpResponseException/Non HTTP response message: IP:埠 failed to respond
【分析】
1、在http請求-高階-客戶端實現,java會複用tcp連結,而httpclient4是重新請求tcp連結,不會進行復用,這個配置預設是空的,Jmetre5.0以上版本會預設使用httpclient4。
2、windows 環境下的埠迴圈回收需要消耗2~4分鐘。由此猜測可能是由於 windows下壓測埠數有限,埠資源被佔滿,沒有及時迴圈回收,導致報錯。
【處理】
【方式一】在http請求-高階-客戶端實現,選擇java
執行後,介面會報關於Cookie重新整理的錯,所以不能使用這個方式。(可能是我這裡的介面處理邏輯問題)
【方式二】
1、 擴大埠數量
設定 windows下最大埠數 65534,嘗試將埠資源數設定為最大,windows最大能支援65534個埠。
(1)使用 win + R 快捷鍵開啟 cmd,輸入 regedit 命令開啟登錄檔
(2)設定 MaxUserPort 數量:
● 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
● 右擊 Parameters,新增一個新的 DWORD,命名為MaxUserPort。
● 然後雙擊 MaxUserPort,輸入 65534,基數選擇 十進位制(如果是分散式執行的話,控制機器和負載機器都需要這樣操作)。
● 修改配置完畢後, 需要重啟 windows 才會生效。
2、提高階口使用率
【分析】
windows下的埠 Time_Wait 導致埠無法使用
windows下的埠 CLOSE_WAIT 導致埠無法使用
【處理】
(1)Time_Wait 解決方案
主要思路是透過縮短 TIME_WAIT 的等待時間,提高階口的使用率。
● 使用 win + R 快捷鍵開啟 cmd,輸入 regedit 命令開啟登錄檔。
● 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
● 右擊 parameters,新增一個新的DWORD,命名為 TcpTimedWaitDelay,將值設定為30, 縮短 TIME_WAIT 的等待時間。
● 重啟windows,配置項生效。
(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 解決方案】
● 使用 win + R 快捷鍵開啟 cmd,輸入 regedit 命令開啟登錄檔。
● 找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters目錄。
● 在該目錄下新增新的配置項。設定合理的Keepalive引數。
"KeepAliveTime"=dword:006ddd00
"KeepAliveInterval"=dword:000003e8
"MaxDataRetries"="5"
● 重啟windows,配置項生效。
我配置後,報錯變少了,但併發更大的量,還是會出現報錯
參考資料:
https://zhuanlan.zhihu.com/p/105697569
https://blog.csdn.net/fengyuyeguirenenen/article/details/123998742