一、背景介绍
基于运行架构,可以分为两种:
单机模式:JMeter安装在一台服务器上,这台机器也是负载机,所有请求都从该机器发出
分布式模式
单机模式存在的问题:
1)JMeter运行时,产生的众多线程会消耗大量的CPU,内存资源,负载机本身可能成为测试瓶颈;
2)单压力机网络流量带宽上限,导致单台压力机无法有效施压,导致测试结果不准确。
如何判断瓶颈是否出现在压力机身上?
1)当单台压力机线程数增加,比如从300线程增加到500线程,服务器接口tps却不再等比例增加;
2)压力机的CPU过高告警
则可判断服务器完全能承接更大的压力,是压力机到了瓶颈。
此时性能的瓶颈在于压力机,使用Jmeter的分布式压测技术,可以解决这些问题,以达到执行大量线程并发施压的目的。
二、分布式压测Linux配置
分布式压测分为一台master机器和多台slave机器,master机器主要用于控制多台slave机器运行并汇总运行结果。压力机资源紧张时,master机器只做控制机有点浪费,也可以通过配置让master机器也作为施压机,既做控制机又做施压机。
(Jmeter分布式体系结构)
程序清单:
1、jdk-1.8.0_171
2、apache-jmeter-5.3.zip (JMeter Master与Slave安装包相同)
服务器列表
这里以Master控制2台Slave为例介绍部署过程。服务器信息如下表所示:
1.master安装:
第一步
安装所需要版本的JDK,本次使用的JDK是V1.8.0_171,并配置JDK环境变量
vim /etc/profile,加入如下配置
在命令行输入 source /etc/profile 使刚刚设置的配置文件生效,接着命令行输入 java -version 检查安装结果
第二步
安装所需要版本的JMeter,本次使用的是Jmeter 5.3。jmeter在Linux和widows下是是通用的,也可以把本地的打包上传到压力机上
进入bin目录下,在命令行输入 chmod 777 jmeter 赋予启动项权限。
在命令行输入 vim /etc/profile 配置环境变量:
在命令行输入 source /etc/profile 使刚刚设置的配置文件生效,接着命令行输入 jmeter -v 检查安装结果
2、slave安装
执行机(slave)安装略,安装步骤同master主控器上的JDK、jmeter
3、master配置
(1).修改配置文件
进入/usr/local/apache-jmeter-5.3/bin 目录,按以下配置修改jmeter.properties配置文件
注:remote_hosts 为执行机的ip及端口,多个执行机可通过英文逗号 "," 进行拼接
server.rmi.ssl.disable=true(关闭SSL传输)
4、slave配置
进入/usr/local/apache-jmeter-5.3/bin 目录,按以下配置修改jmeter.properties配置文件
server.rmi.ssl.disable=true
tips:网上有的说还需要配置 jmeter.properties 将remoter_hosts=修改为本机ip,server_port=1099放开,我只配置的server.rmi.ssl.disable=true,没有问题
~~~~~~以上调度机和执行机均配置完成!!~~~~~~~
5、分布式压测运行
1.Slave上启动./jmeter-server(进到jmeter的bin目
2. 在Master上执行分布式压测命令(Master如果也当执行机的话,也需要启动./jmeter-server):
jmeter -GthreadNum=1 -Gduration=30 -Jhead_path=/data/wyl/axg-notebook-nodeAuto/result -n -t /data/wyl/axg-notebook-nodeAuto/axg_dubbo_notebook_online.jmx -l /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.jtl -j /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.log -e -o /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/resultHTMl/ -r
-n 指定JMeter在CLI模式下运行
-t 加载测试脚本文件JMX
-l 指定日志文件JTL用来记录取样器的结果
-e 在性能测试后生成仪表盘报表
-o 在负载测试后,生成报告仪表板的输出文件夹
-j 指定JMeter的运行日志
-r 按照JMeter property "remote_hosts"中配置的服务器运行测试用例,如:jmeter -n -t script.jmx -r
-R 指定远程服务器运行测试用例,如jmeter -n -t script.jmx -R server1,server2,…
参数 -J 和 -G
1、格式:-J变量名=值 -G变量名=值
2、相同之处:设置jmeter属性,例如线程数、循环次数、ramp up-time等
3、不同之处:-J是设置本地jmeter属性;-G是设置server的jmeter属性(只有设置了远程机,开启了远程服务,才需要用到-G)
3.执行结束后下载HTML报告到本地用于填写报告使用
HTML中图标解析参考:https://blog.csdn.net/lvan_test/article/details/111570921
三、实操
1、分布式多节点执行: -r 所有remote_hosts配置的slave(共两台机器,master也作为执行机)
jmeter -GthreadNum=1 -Gduration=30 -Jhead_path=/data/wyl/axg-notebook-nodeAuto/result -n -t /data/wyl/axg-notebook-nodeAuto/axg_dubbo_notebook_online.jmx -l /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.jtl -j /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.log -e -o /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/resultHTMl/ -r
2、单节点执行:-R指定slave执行
jmeter -GthreadNum=1 -Gduration=30 -Jhead_path=/data/wyl/axg-notebook-nodeAuto/result -n -t /data/wyl/axg-notebook-nodeAuto/axg_dubbo_notebook_online.jmx -l /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.jtl -j /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.log -e -o /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/resultHTMl/ -R 172.16.124.107
3、不用分布式 去掉-r 参数化改成-J
jmeter JGthreadNum=1 -Jduration=30 -Jhead_path=/data/wyl/axg-notebook-nodeAuto/result -n -t /data/wyl/axg-notebook-nodeAuto/axg_dubbo_notebook_online.jmx -l /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.jtl -j /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/result.log -e -o /data/wyl/axg-notebook-nodeAuto/result/20230212_1*30/resultHTMl/
四、踩过的坑及注意事项
1、若测试计划中引用到了参数化csv文件,需要将参数化文件复制到各台Slave上,并且存放的目录路径需要保持一致;
2、csv路径配置错误
3、jmeter.properties的文件找到server.rmi.ssl.disable=false,改为true
4、参数化-G和-J的坑
-J是设置本地jmeter属性;-G是设置server的jmeter属性
5、这里设置不用关注括号里的备注,忽略首行就true,不忽略false就可以
6、线上zk地址和端口找开发要,选择zookeeper
7、进行性能测试前,尽量对Jmeter进行减负,避免运行时间过长,导致Jmeter卡死:
(1)并发线程不要设置太高,建议单机300以下
(2)“察看结果树”勾选“仅日志错误”,尽可能减少jvm内存使用
(3)在压测时,要禁用诸如View Result Tree这类的监听器,这类监听器非常耗内存
(4)用jmeter测试时使用BeanShell脚本获取随机参数值,会导致请求时间过长,TPS过低。应改为使用csv读取参数值,记录的TPS会更加准确
8、Master与各Slave使用的Java、jmeter版本保持一致;
9、若测试计划中引用了某插件,则Master与各Slave都要包含该插件
10、测试计划只需要放在Master上,执行时会自动分发到各Slave,不需要每台Slave复制一份
五、压测指标
指标项目 |
指数 |
---|---|
错误率 | <=3% |
99线 | <=1000ms |
qps(单台) | **研发给出 |
tips:具体要看研发或者运维要测的内容,是要压最大承载的QPS还是有具体的指标