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

修改完成后再次压测,错误不再有了。

部分原理不是很明白,等后续再去了解相关知识点。

不过对接口压测的时候,出现另外的问题,待后续解决了再更新

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