通过搜索,发现几种方案:如果你搜索到本文,请先尝试方案2到方案4
---------------------------------------------------------------------------------------------------------------------------------
解决方案1: 问题描述:最近压测接口时,并发一段时间后,会报java.net.BindException: Address already in use: connect
Jmeter里的http sample勾选了keep alive,导致会话一直保持,而windows本身的端口有限,导致端口被占用完后,无法分配新的端口,因此会产生java.net.BindException: Address already in use: connect 报错。
方案: http SAMPLE 不勾选keep alive
结果:我去掉后勾选项后并没有解决我的问题
---------------------------------------------------------------------------------------------------------------------------------
解决方案2:问题描述:最近在用jmeter做压力测试时,发现一个问题,当线程持续上升到某个值时,报错:java.net.BindException: Address already in use: connect,
原因:windows提供给TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收它们,就导致我们在短时间内跑大量的请求时将端口占满了,导致如上报错。
方案:
1.cmd中输入regedit命令打开注册表;
2.在 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters右键Parameters;
3.添加一个新的DWORD,名字为MaxUserPort;
4.然后双击MaxUserPort,输入数值数据为65534,基数选择十进制;
5.完成以上操作,务必重启机器,问题解决,亲测有效;
结果:我亲测并没有效果,于是接着搜索解决方案,
---------------------------------------------------------------------------------------------------------------------------------
解决方案3:问题描述:今天在自己压测接口的时候遇到下面这个错误。jmeter java.net.BindException: Address already in use: connec
搜索之后发现需要在regedit中添加注册表项MaxUserPort,TcpTimedWaitDelay重启一下就可以解决了。
解决方法:
打开注册表:ctrl+r 输入regedit
进入注册表,路径为:\HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
新建DWORD值,(十进制)设置为30秒。名称:TcpTimedWaitDe,值:30
新建DWORD值,(十进制)最大连接数65534。名称:MaxUserPort,值:65534
结果:这个方案和第二个方案一样,我亲测并没有效果,于是接着搜索解决方案,
---------------------------------------------------------------------------------------------------------------------------------
解决方案4:问题描述:近期因为疫情的原因,公司做了一个抢口罩的页面。需要对页面及接口做压力测试,遂遇到标题的问题。
原因: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,咨询开发后是请求返回超时。(这个问题我并没有遇到,也没有实现机会,在这里暂时不做解释,先加个链接,后续需要再看)
结果:测试之后还是没有解决,于是我又搜索了一番,有人说不勾选keep alive是不对的,我勾上确实解决了我所面临的问题,就是不知道在全盘勾选的情况下具体是那个参数起到了作用,也许方案2就能解决我所面临的问题,后续等换了电脑再次遇到该问题在具体实验吧
---------------------------------------------------------------------------------------------------------------------------------
之后有搜索 Keep-Alive在性能压测中的影响,这里先放个链接吧,等我研究明白在具体自己写