1、jmeter java.net.NoRouteToHostException: Cannot assign requested address (Address not available)
错误原因:由于客户端连接端口用尽,无法建立socket连接所致,虽然socket正常关闭,但是端口不是立即释放,而是处于 TIME_WAIT 状态,默认等待60s后释放。
如果使用的是ui客户端,请将keep alive选项勾掉
2、java.net.SocketException: Socket closed
错误原因:在JMeter下,发送http 请求时,一般都是默认选择了use keepAlive,这个是连接协议,JMeter坑就在这里,默认勾选了这个(如果不勾选的话,也不会保存),但其配置JMeter.properties中的时间设置默认却是注销的,也是是说,不会等待,一旦连接空闲,则立马断开了,导致我们压测中出现了事务失败的情形。 也就是未设置连接的超时时间。
如果在 HTTP Request Sampler 的 Basic 里勾选了 Use KeepAlive,那么建议在 Advanced 页签下:
①、Implementation 选为 HttpClient4
②、Timeouts 中的 Connect 设置一个10~60秒的值,表示连接的空闲超时时间,避免由于没收到被压测端的响应回来的 Keep-Alive 的 Header 导致的连接断开
3、Jmeter 短时间内跑大量线程报错 Non HTTP response code: org.apache.http.conn.HttpHostConnectException/Non HTTP response message: Connect to x failed: Connection timed out
5台机器,每台20个线程,循环1000次,一共跑了10万个请求,报错如下
原因应该是: linux 配给客户端连接的端口用尽,无法建立新的socket连接所致,虽然已经完成的socket关闭了,但是端口默认等待60s才会释放,所以只要我们再多给点可用的端口就好了。
解决方法如下:
查看Linux支持的客户端连接端口范围命令:
cat /proc/sys/net/ipv4/ip_local_port_rangecat /proc/sys/net/ipv4/ip_local_port_range,60999-32768=28231 个ipv4端口可用。
①调低端口释放后的等待时间, 默认为60s, 修改为15~30s。
echo 30 > /proc/sys/net/ipv4/tcp_fin_timeout
②修改tcp/ip协议配置 tcp_tw_recycle :是否开启快带回收TIME_WAIT tcp连接的功能,快速回收socket资源, 默认为0否, 修改为1是.
echo 1 > /proc/sys/net/ipv4/tcp_tw_recycle
③ tcp_tw_resue 是否可以使用TIME_WAIT tcp连接用于建立新的tcp连接,默认为0否, 修改为1是。
echo 1 > /proc/sys/net/ipv4/tcp_tw_reuse
4、address already in use:connect
运行脚本报错:
java.net.BindException: Address already in use: connect
原因分析:
这个问题的原因是windows端口被耗尽了(默认1024-5000),而且操作系统要 2~4分钟才会重新释放这些端口,所以可以增加windows的可用端口来解决。windows端口最大数为65534
解决方法一:
修改操作系统注册表
①、cmd输入:regedit
②、找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\TCPIP\Parameters
③、新建两个 DWORD值,name:MaxUserPort,value:65534(十进制);name:TcpTimedWaitDelay,value:30(十进制)
④、重启系统
解决方法二:
设置线程组时,勾选 same user on each iteration 。
5、返回Connection timed out: connect
解决方法:
cmd打开控制台,运行netsh int ipv4 set dynamicport tcp start=1025 num=64510