性能测试工具 Jmeter Web 性能测试入门 (七):Performance 测试中踩过 Jmeter 的坑

cc · 2017年11月23日 · 最后由 dgz_tester 回复于 2018年12月28日 · 2663 次阅读

脚本运行的过程中,大量 request 抛 error,但没有地方能够查看 request 是因为什么 error 的。

原因:Jmeter 默认禁掉了运行过程中每个 request 的具体 response 信息收集,只保留了 status。
解决方法:修改 jmeter.properties 文件中 Results file configuration。把所有和 response 相关 False 的项改为 True。运行后将输出保存.jtl 文件中。添加 tree 监听器,过滤只显示 error request,可以查看到 request 和 response 的具体信息,从而判断出错原因。

tree report 中显示 socket time out 相关的错误,如何判断是 jmeter 工具的原因,还是服务器的原因。

  • 错误一:
    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 脚本运行的过程中,服务器性能参数没有明显变化(CPU,内存,I/O),但 request 的响应时间很长。

原因:观察 jmeter agent 机器网络使用情况,网络使用持续达到带宽的限制峰值。request 发送的过程中 pending 在网络中,实际并发的 request 并没有同一时间到达服务器,所以服务器没有明显变化。
解决方案:提高 jmeter agent 机器网络带宽。

共收到 2 条回复 时间 点赞

java.net.ConnectException: Connection refused: connect
这个错误又是什么原因

oleeks 回复

这个问题解决了嘛?我目前也是遇到这个问题

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册