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超时