JMeter高级使用笔记

JMeter的使用不能说最频繁,但是性能测试之前多次使用过,每次都有些时间间隔。

汇总下之前零散的笔记供参考。

接上文JMeter基础篇

一些插件用法

用Plugins Manager方便插件管理,需要把下载的插件管理jar放在lib/ext 目录并重启JMeter. GUI: [Options] - [Plugins Manager]下载安装。

常用插件:

  • PerfMon监控服务端
  • ConcurrencyThreadGroup
  • InterThreadCommunication

非GUI模式

参数说明:

  • -n: 非GUI模式执行
  • -t: 测试计划文件的位置
  • -l: 指定生成测试结果的保存文件(jtl文件格式)
  • -e: 测试结束后生成测试报告
  • -o: 指定测试报告生成位置
# 命令行执行并生成报告
jmeter -n -t testplan.jmx -l result.jtl

如何查看JTL报告

添加"察看结果树",点击"浏览"打开生成的jtl文件。

也可以生成HTML报告:

jmeter.bat -g result.jtl -o /tmp/report

以XML查看jtl

在jtl文件的testResults标签前添加

Windows批处理:

del /s /Q  result.jtl
rd /s /Q E:\report
md  E:\report
jmeter -n -t E:\opt\apache-jmeter-5.1.1\bin\testplan.jmx -l result.jtl -e -o E:\report
# 汇总报告
# jmeter.properties
summariser.log=true

分布式执行

分布式测试时各slave要读取不同的csv数据。

1 . 从节点 - 禁用RMI SSL: jmeter.properties

server.rmi.ssl.disable=true

2 . 从节点 - 启动Slave

JMETER_HOME/bin/jmeter-server 或 JMETER_HOME/bin/jmeter -s 

3 . 主节点 - 添加slave IP到master配置文件: jmeter.properties

remote_hosts=192.168.1.101,192.168.1.102

4 . 主节点 - 远程界面启动: [Run]- [Remote Start All] 或 命令行

jmeter -n -t script.jmx -r # 或者 jmeter -n -t script.jmx -R server1,server2,…

注: 有时候必须指定report发送到的master地址,否则收不到报告,并一直停留在Waiting for possible Shutdown/StopTestNow/Heapdump message on port 4445 这时需要配置 -Djava.rmi.server.hostname=[slave节点IP]

调试和日志

调试常用组件:

  • View Result Tree(仅用于调试)
  • Debug Sampler
  • JSR223 Sampler
  • RegExp Tester

详细调试

命令行带参数 -LDEBUG 启动文件:%JM_START% “%JM_LAUNCH%” %ARGS% %JVM_ARGS% -jar “%JMETER_BIN%ApacheJMeter.jar” %JMETER_CMD_LINE_ARGS% -LDEBUG

set JVM_ARGS=-Dlogback.debug=true -Dlogback.configurationFile=logback.xml

性能优化

  • 使用非GUI模式
  • 监听器仅用于调试,大并发关闭
  • 增加Heap大小

JMeter Engine(Node): 对于HTTP/S协议,推荐每个Engine最多运行1000个threads/virtual users;  

通常考虑以下2个因素:

  • 每个Engine 每秒最多600个hits
  • 每个Engine最多300Mbps带宽

模拟更高并发

JMeter 是同步线程请求/BIO,如果需要更高的压力应该用异步线程。

当设置所有的请求均为1s超时时,可以类比实现tps=线程数的效果,jmeter默认使用httpclient4,可以在HTTPHC4Impl的setupRequest()方法中增加超时时间限制

    HttpParams requestParams = httpRequest.getParams();
    ...
    requestParams.setIntParameter(CoreConnectionPNames.SO_TIMEOUT, 1000);
    requestParams.setIntParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000);//设置请求均为1000ms超时

扩展阅读

教程

增强