一、背景介绍


   基于运行架构,可以分为两种:

         单机模式: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还是有具体的指标