学习笔记—性能测试—分布式Jmeter搭建与使用

Jmeter

  总所周知,Jmeter是可以用于接口测试和性能测试的一个工具。随着现在技术的发展,对性能测试的要求是日益提升的,因此,Jmeter的性能测试是极为重要的。

  然后,Jmeter是基于Java开发的,每创建一个线程或者说一个虚拟用户的时候,JVM就会默认为每个线程分配1M的堆栈内存空间,由于配置限制,Jmeter在一个单机的情况下,是很难实现过高的并发的。

  因此,可以通过Jmeter的分布式部署,来整合多台主机的硬件资源,以此达到对被测接口进行压力测试的目的。

  在分布式的Jmeter测试环境中,有两个非常重要的角色,分别为master和slaves。

  master:也可以叫做主节点,主要就是负责发送测试脚本到slaves节点上,并且,在master上可以启动、停止、监控测试。最后,slaves通过将测试结果返回到master并由master进行汇总分析。

  slaves:也可以叫做是从节点,主要负责从master节点来接收测试脚本,并执行压测,最后返回测试结果给master节点。

  通过Jmeter的分布式部署使用,可以达到较高的可扩展性、并能高效利用多台机器的资源进行压力测试,且更接近于实际上的高并发场景,评估会更加全面。

  当然,采用Jmeter的坏处就是对环境的一致性要求比较高,且网络因素可能会造成一定的影响。因此,在具体的部署使用过程中,要注意:带宽要够,主从节点的时间要同步,防火墙要确保不会阻拦。

单机Jmeter搭建

  首先,对于一个单机的普通的Jmeter搭建来说,可以直接访问https://jmeter.apache.org/download_jmeter.cgi

  并下载适合版本的包(主要需要安装的机器上有Java的),例如,于此选择apache-jmeter-5.6.3.zip

  下载后,将其解压到本地没有空格和中文路径的文件夹中,注意不要出现两层同名文件夹。

  将bin目录配置进入环境变量:

1
D:\learning_demo\jmeter\apache-jmeter-5.6.3\bin

  可以通过如下命令查看:

1
jmeter -v

  命令行输入Jmeter,出现以下内容:

单机版Jmeter

基于Docker的分布式Jmeter搭建及测试

  这里采用Docker作为分布式Jmeter搭建的工具。

  首先,需要pull对应的master和slave镜像,镜像的选择比较多样,这里采用:

1
2
docker pull runcare/jmeter-master
docker pull runcare/jmeter-slave

  接着创建docker虚拟网络,来保证网络隔离和容器间的通信。

  这里创建一个jmeter的网络:

1
2
3
4
docker network create jmeter

# 可以查看列表
docker network ls

  而后,以三个容器作为Jmeter的slave节点创建从服务:

1
2
3
docker run -it -d --name slave_01 --network jmeter runcare/jmeter-slave
docker run -it -d --name slave_02 --network jmeter runcare/jmeter-slave
docker run -it -d --name slave_03 --network jmeter runcare/jmeter-slave

  接着通过logs查看每个slaves的ip地址:

1
2
3
docker logs slave_01
docker logs slave_02
docker logs slave_03

  此处显示如下:

1
2
3
4
5
6
7
###### slave_01 ######
Sep 23, 2024 1:29:12 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Using local port: 60001
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[172.23.0.2:60001](local),objID:[-15e5ed54:1921d5af285:-7fff, -1734960256902179902]]]
Httpd started on port: 9000
Sessiond started on port: 9001
1
2
3
4
5
6
7
###### slave_02 ######
Sep 23, 2024 1:29:30 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Using local port: 60001
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[172.23.0.3:60001](local),objID:[-29c83ff3:1921d5b38b0:-7fff, -7241895482354295030]]]
Httpd started on port: 9000
Sessiond started on port: 9001
1
2
3
4
5
6
7
###### slave_03 ######
Sep 23, 2024 1:29:34 PM java.util.prefs.FileSystemPreferences$1 run
INFO: Created user preferences directory.
Using local port: 60001
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[172.23.0.4:60001](local),objID:[-3fd9085:1921d5b4783:-7fff, -3735717183614470538]]]
Httpd started on port: 9000
Sessiond started on port: 9001

  可以看到三个容器的地址分别为:

1
2
3
172.23.0.2
172.23.0.3
172.23.0.4

  在此基础上,先创建一个测试脚本(可通过本地的jmeter进行创建),创建gagaduck.jmx一个简单的测试脚本,并放在~/jmx_file_dir下面。启动master节点执行测试:

1
result=`date +"%Y%m%d%H%M%S"` && docker run --rm --network jmeter_net -v /root/jmx_file_dir:/data runcare/jmeter-master jmeter -n -t /data/gagaduck.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.23.0.2,172.23.0.3,172.23.0.4

jmeter压力测试
  同时,于此,可以查看slave的日志:

1
2
Starting the test on host 172.23.0.4 @ Mon Sep 23 14:16:26 CST 2024 (1727072186051)
Finished the test on host 172.23.0.4 @ Mon Sep 23 14:16:35 CST 2024 (1727072195655)

  每一个slave都有执行test的日志输出。

  对于这样一条命令,首先result=date +”%Y%m%d%H%M%S”这个是获取当前的日期时间并许以特定的格式。

  docker run –rm表示运行一个 Docker 容器,–rm 表示容器在执行结束后自动删除。

  
-v /root/jmx_file_dir:/data
是进行卷挂载,将本地的 /root/jmx_file_dir 目录映射到容器内的 /data 目录,由此进行测试。

  jmeter -n -t /data/gagaduck.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.23.0.2,172.23.0.3,172.23.0.4这样的一个部分呢,适用于容器内的具体操作。这里使用 jmeter 工具进行相关测试,指定了测试计划文件、结果文件、日志文件等,并指定了要报告到的 IP 地址(Slaves节点的IP地址)。

  在该命令启动后,master首先会将本地的jmx文件拷贝并分发到指定jmeter网络的所有slave节点上。

  拿到了测试脚本之后,slave就会以命令行的模式执行脚本。执行过程中,slave会将执行获得的数据结果传回到master节点上,由master节点来汇总。也就是上面图片所展示的内容。

  最后,回到挂在的目录下面,会有一个文件夹,这个文件夹以当前时间为名字进行命名。

报告路径
  进去后,打开index.html,便是当前这个测试的测试报告了。

测试报告


学习笔记—性能测试—分布式Jmeter搭建与使用
https://gagaducko.github.io/2024/09/24/学习笔记—性能测试—分布式Jmeter搭建与使用/
作者
gagaduck
发布于
2024年9月24日
许可协议