1 java.net.BindException: Address already in use: connect
当线程数持续上升到一个点的时候,运行脚本的时候有很多报错,如图:java.net.BindException: Address already in use: connect
通过 netstat -a 命令查看,有一大堆状态为 TIME_WAIT 的占用连接不被释放
开始以为是单机运行脚本运行不过来,所以另加了一台负载机同时运行脚本
分布式环境部署参考:
https://www.cnblogs.com/whitewasher/p/6946207.html
但是依然还是会报错,后面查阅了相关资料后发现,是因为windows本身提供的端口访问机制的问题。
Windows XP提供给 TCP/IP链接的端口为 1024-5000,并且要四分钟来循环回收他们。就导致我们在短时间内跑大量的请求时将端口占满了。
解决方案为:
- cmd中,用regedit命令打开注册表
- 在
HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
下,右击parameters
,添加新的DWORD
(如果是分布式运行的话,控制机器和负载机器都需要这样操作哦)- 新建`DWORD`值,name:`TcpTimedWaitDe`,value:`30(十进制)` –> 设置为30秒,默认是240秒 - 新建 `DWORD`值,name:`MaxUserPort`,value:`65534(十进制)`–> 设置最大连接数65534
- 修改配置完毕之后记得重启机器才会生效
参考资料:
https://www.cnblogs.com/pgf622/p/9109521.html
https://blog.csdn.net/zoulonglong/article/details/80940411
https://blog.csdn.net/lifuxiangcaohui/article/details/40188847
2 java.net.SocketException: Socket closed
如题,jmeter报出java.net.SocketException: Socket closed
,我查询了下,服务器是正常的,可以返回数据,基本确定问题出在我这边jmeter。查询原因,看到有人说:该异常在客户端和服务器均可能发生。异常的原因是己方主动关闭了连接后(调用了Socket
的close
方法)再对网络连接进行读写操作。
Socket closed
Non HTTP response code: org.apache.http.NoHttpResponseException (the target server failed to respond)
资料查询:https://wiki.apache.org/jmeter/JMeterSocketClosed
问题原因:在JMeter下,发送http 请求时,一般都是默认选择了use keepAlive(这个是什么?看后面资料),这个是连接协议,JMeter坑就在这里,默认勾选了这个(如果不勾选的话,也不会保存),但其配置JMeter.properties中的时间设置默认却是注销的,也是是说,不会等待,一旦连接空闲,则立马断开了,导致我们压测中出现了事务失败的情形。
解决方案:修改httpclient4.idletimeout=<time in ms>
设置成自己觉得合理的时间,一般可设置成10-60s
(表示连接空闲10s后才会断开),注意这边单位是ms。修改完成后再次压测,错误不再有了。
3 java.net.SocketException: Connection reset
参考资料:https://www.cnblogs.com/shoren/p/httpclient-connectionreset.html