jmeter壓力測試報錯:java.net.BindException: Address already in use: connect解決方案

近期因爲疫情的原因,公司做了一個搶口罩的頁面。需要對頁面及接口做壓力測試,遂遇到標題的問題。

原因:windows提供給TCP/IP鏈接的端口爲 1024-5000,並且要四分鐘來循環回收它們,就導致我們在短時間內跑大量的請求時將端口占滿了,導致如上報錯。

解決辦法(在jmeter所在服務器操作):

1.cmd中輸入regedit命令打開註冊表;

2.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters右鍵Parameters;

3.添加一個新的DWORD,名字爲MaxUserPort;

4.然後雙擊MaxUserPort,輸入數值數據爲65534,基數選擇十進制;

5.完成以上操作,務必重啓機器。

通過上述方式後,重新執行一次腳本。問題得到較好的解決,但是當循環次數和併發量上去之後,依舊存在該情況,遂找公司大神詢問後,添加如下配置:

TcpNumConnections = 16777214

MaxHashTableSize = 65536

MaxFreeTcbs = 16000

TcpTimedWaitDelay = 30

相關值解析

MaxUserPort:最大動態端口數(Default = 5000, Max = 65534)
TcpTimedWaitDelay:TCP等待延遲時間(30)
TcpNumConnections:TCP最大連接數(Default = 16,777,214)

MaxFreeTcbs:最大TCP控制塊(1000-2000)

MaxHashTableSize:最大TCB Hash table數量(64-65536)

運行之後,問題算是解決了,但是隨着併發和循環次數增加之後,遇到另外一個問題:

java.net.SocketTimeoutException:Readtimed out,資訊開發後是請求返回超時。

問題原因:在JMeter下,發送http 請求時,一般都是默認選擇了use keepAlive,這個是連接協議,默認勾選了這個(如果不勾選的話,也不會保存),但其配置JMeter.properties中的時間設置默認卻是註銷的,也是是說,不會等待,一旦連接空閒,則立馬斷開了,導致我們壓測中出現了事務失敗的情形。

解決:進入jmeter安裝目錄bin文件夾下,找到“user.properties”文件,文件中增加

httpclient4.retrycount =
hc.parameters.file = hc.parameters

修改httpclient4.idletimeout= 設置成自己覺得合理的時間,一般可設置成10-60s(表示連接空閒10s後纔會斷開),注意這邊單位是ms。

找到“hc.parameters.file”,文件中增加

http.connection.stalecheck $ Boolean = true

修改完成後再次壓測,錯誤不再有了。

部分原理不是很明白,等後續再去了解相關知識點。

不過對接口壓測的時候,出現另外的問題,待後續解決了再更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章