近期因爲疫情的原因,公司做了一個搶口罩的頁面。需要對頁面及接口做壓力測試,遂遇到標題的問題。
原因: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
修改完成後再次壓測,錯誤不再有了。
部分原理不是很明白,等後續再去了解相關知識點。
不過對接口壓測的時候,出現另外的問題,待後續解決了再更新