JMeter-壓測問題分析

落雪631發表於2024-04-07

【報錯資訊】

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。

JMeter-壓測問題分析

然後雙擊 MaxUserPort,輸入 65534,基數選擇 十進位制(如果是分散式執行的話,控制機器和負載機器都需要這樣操作)。

JMeter-壓測問題分析

修改配置完畢後, 需要重啟 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 的等待時間。

JMeter-壓測問題分析

重啟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

相關文章