原因:Jmeter 默认禁掉了运行过程中每个 request 的具体 response 信息收集,只保留了 status。
解决方法:修改 jmeter.properties 文件中 Results file configuration。把所有和 response 相关 False 的项改为 True。运行后将输出保存.jtl 文件中。添加 tree 监听器,过滤只显示 error request,可以查看到 request 和 response 的具体信息,从而判断出错原因。
错误一:
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: connect timed out
查看 Load time 的时间要大于 request 设置的 connect time out 时间,所以抛出该异常。可能是由于服务端有较多请求正在处理(且处理时间较长),导致 JMeter 不能连接上服务器而产生的。
错误二:
Java.NET.BindException: Address already in use: connect
原因:短时间内 new socket 操作很多,而 socket.close() 操作并不能立即释放绑定的端口,而是把端口设置为 TIMEWAIT 状态,过段时间 (默认 240s) 才释放,(用 netstat -na 可以看到),最后系统资源耗尽 (windows 上是耗尽了 pool of ephemeral ports ,这段区间在 1024-5000 之间)
解决方法:在运行 JMeter agent 的机器上,添加注册表条目 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
MaxUserPort 65334
TcpTimedWaitDelay 30
错误三:
java.lang.OutOfMemoryError: Java heap space
原因:观察运行 jmeter 机器的内存,占用较高,超过了 jmeter 设置的内存上限。
解决方案:修改 jmeter 配置文件,调整内存可用的范围
修改/bin/jmeter.bat 文件:找到这 2 行
set HEAP=-Xms256m -Xmx256m
set NEW=-XX:NewSize=128m -XX:MaxNewSize=128m
改为:
set HEAP=-Xms1024m –Xmx2048m(最大值不能超过系统内存的 1/2)
set NEW=-XX:NewSize=128m -XX:MaxNewSize=512m
错误四:
Response code: Non HTTP response code: java.net.SocketTimeoutException
Response message: Non HTTP response message: Read timed out
发生该错误时,jmeter 已经连接上服务器,查看 load time 没有超过设定的 request timeout 时间,错误可能的原因是,服务器那边未处理该线程的请求,或者为保证服务能力,断掉了连接。
为了验证该猜想,持续大于半小时向服务器发送该并发数量的请求,一段时间后,request 收到 503 的 response,证明猜想。
错误五:
Failed to initialise remote engine java.rmi.ConnectException: Connection refused to host:
原因:分布式测试时,server 和 agent 之间的连接有问题。单个机器排查后,发现是某个 agent 机器安装了多个网卡,rmi 远程的时候找的是虚拟机的网卡,导致连接失败。
解决方案:禁掉不使用的虚拟机网卡,测试之后再恢复。
原因:观察 jmeter agent 机器网络使用情况,网络使用持续达到带宽的限制峰值。request 发送的过程中 pending 在网络中,实际并发的 request 并没有同一时间到达服务器,所以服务器没有明显变化。
解决方案:提高 jmeter agent 机器网络带宽。