大家好,随着技术的不断发展,对性能测试的要求也日益提高。在这样的背景下,如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在,就让我们开启这场探索之旅,揭开其神秘的面纱。前段时间给大家分享了关于 Locust 性能测试相关的知识,其中就有 Locust 与 Jmeter 两关工具的对比,各有优劣,大家可以根据自己的业务和场景,选择更适合自己的工具,毕竟,工具只是手段,测试思路才是重中之重,关于 Locust 脚本编写与分布式搭建,大家可以参考:
使用Python3 + Locust进行性能测试
基于Docker + Locust的数据持久化性能测试系统
一、Jmeter分布式介绍
在工作中,我们经常需要对一些关键接口进行高 QPS 的压测。JMeter 是使用 Java 语言开发的,当创建一个线程(虚拟用户)时,JVM 会默认为每个线程分配 1M 的堆栈内存空间。由于单台试压机的配置限制,很难实现过高的并发。因此,我们可以通过实现 JMeter 的分布式,整合多台主机的硬件资源,从而同时对被测试接口进行压力测试。
在 Jmeter 分布式测试环境中,有两个非常重要的角色:Master 和 Slaves
Master:
也被称为控制机或主节点,主要负责以下任务:
- 发送测试脚本:master 节点将压测脚本发送到 slaves 节点上。
- 控制测试执行:master 节点可以启动、停止测试,并监控测试的进度。
- 汇总测试结果:slaves 节点将测试结果返回给 master 节点,master 节点对这些结果进行汇总和分析。
Slaves:
也被称为从节点或负载机,主要负责执行压测任务,它们的具体职责包括:
- 接收测试脚本:slaves 节点从 master 节点接收压测脚本。
- 执行测试:slaves 节点按照接收到的脚本执行压测操作,向目标系统发送请求。
- 返回测试结果:测试结束后,slaves 节点将测试结果返回给 master 节点。
Jmeter分布式的优缺点:
优点:
- 可扩展性强:能够通过增加 slaves 节点轻松提升施压能力,以模拟更大规模的并发量。
- 资源利用高效:可以充分利用多台机器的资源来执行压测任务。
- 更真实模拟场景:可以更接近实际的高并发场景,对系统性能进行更全面的评估。
缺点:
- 配置相对复杂:需要对 master 和 slaves 节点进行一系列的配置和管理工作。
- 网络因素影响:网络情况可能对测试结果产生一定干扰,比如延迟、丢包等。
- 环境一致性要求高:要求各个节点的环境尽可能保持一致,否则可能影响结果的准确性。
使用Jmeter分布式的注意事项:
- 压力测试瓶颈:压力测试瓶颈大都在带宽上面,需要保证压力机的带宽要比服务器的带宽高,不然压力上不去。
- 时间同步:需要保证 master 和 slaves 之间的时间同步。
- 防火墙问题:关闭防火墙。
- 线程数设置:在设定脚本线程数目时,需要除以执行机个数,设定并发线程数。
二、下载Jmeter Master与Slave镜像
docker pull runcare/jmeter-master
docker pull runcare/jmeter-slave
分别执行上述命令进行master与slaves镜像下载,如下图:
下载完成后,查看镜像:
三、创建虚拟网络
Docker 虚拟网络是 Docker 为应用程序创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。
Docker 虚拟网络的作用主要有以下几点:
- 提供网络隔离:Docker 虚拟网络为容器提供了独立的网络环境,使容器之间的网络通信与外部网络隔离,增强了网络安全性。
- 实现容器间通信:通过 Docker 虚拟网络,容器可以在不同的宿主机上进行通信,形成一个跨主机的分布式应用系统。
- 简化网络配置:Docker 虚拟网络可以自动为容器分配 IP 地址和网络配置,减少了手动配置网络的复杂性。
- 提高网络性能:Docker 虚拟网络可以优化网络性能,减少网络延迟和提高带宽利用率。
- 增强应用的可移植性:由于容器的网络环境是由 Docker 虚拟网络提供的,因此应用程序在不同的环境中运行时,不需要担心网络配置的差异,增强了应用的可移植性。
在 Jmeter 分布式中使用 Docker 虚拟网络具有以下一些好处:
- 网络隔离性更好:确保不同的 Jmeter 组件(如 master 和 slaves)之间的网络通信相对独立和稳定,减少外界干扰。
- 灵活配置网络环境:可以根据测试需求定制网络拓扑、IP 分配等,更方便地模拟各种复杂网络场景。
- 增强资源管控:便于对分布式测试中涉及的网络资源进行集中管理和监控,提高资源利用效率。
- 环境一致性:更容易保证各个节点处于相同的网络环境中,避免因网络差异导致测试结果不准确。
- 便于迁移和扩展:整个测试架构可以较为便捷地在不同环境中迁移和扩展,适应不同测试场景的要求。
创建虚拟网络,名称为 jmeter_net。
docker network create jmeter_net
创建完成后,查看虚拟网络列表
docker network ls
四、启动Jmeter Slaves节点
假如有三台服务器作为 Jmeter 的 Slave 节点,可以分别在每台服务器上面启动一个 Slave 容器。
docker run -it -d --name slave_01 --network jmeter_net runcare/jmeter-slave
docker run -it -d --name slave_02 --network jmeter_net runcare/jmeter-slave
docker run -it -d --name slave_03 --network jmeter_net runcare/jmeter-slave
命令解释:
docker run:这是 Docker 命令,用于创建并运行一个新的容器。
-it:表示以交互模式运行容器,并打开一个终端连接到容器内部。
-d:表示在后台运行容器。
--name slave_01:为容器指定一个名称,这里将容器命名为slave_01。
--network jmeter_net:将容器连接到名为jmeter_net的虚拟网络。
runcare/jmeter-slave:指定要运行的镜像,这里使用的是runcare/jmeter-slave镜像。
本文中使用一台服务器作为演示,执行上述命令后,如下图:
查看容器运行状态:
Jmeter 的 Slave 容器启动成功。
五、查看Slaves节点的IP地址
通过 Slaves 容器日志查看所有 Slave 的IP地址:
docker logs slave_01
docker logs slave_02
docker logs slave_03
如下图:
通过查看日志,可以知道三个 Slaves 容器的IP地址分别是:
172.19.0.2、172.19.0.3、172.19.0.4
六、准备一个Jmeter脚本
此处编写一个比较简单的脚本。
保存脚本名称 test_baidu.jmx,并存放在 /root/jmx_file_dir 目录下,下面我们会将 /root/jmx_file_dir 这个目录挂在到 Jmeter Master节点的容器内部。
七、启动Jmeter Master节点执行测试
下面这条命令主要用于启动 Jmeter 分布式的 Master 节点。
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/test_baidu.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.19.0.2,172.19.0.3,172.19.0.4
命令解释:
result=date +"%Y%m%d%H%M%S":获取当前日期和时间并以特定格式(年、月、日、时、分、秒)赋值给变量 result`。
docker run --rm:运行一个 Docker 容器,--rm 表示容器在执行结束后自动删除。
--network jmeter_net:指定容器连接到名为 jmeter_net 的网络。
-v /root/jmx_file_dir:/data:进行卷挂载,将本地的 /root/jmx_file_dir 目录映射到容器内的 /data 目录。
runcare/jmeter-master:指定要运行的镜像为 runcare/jmeter-master。
jmeter -n -t /data/test_baidu.jmx -l /data/$result.jtl -j /data/$result.log -e -o /data/$result -R 172.19.0.2,172.19.0.3,172.19.0.4:这是在容器内执行的具体操作,使用 jmeter 工具进行相关测试,指定了测试计划文件、结果文件、日志文件等,并指定了要报告到的 IP 地址(Slaves节点的IP地址)。
启动后,master 节点会执行以下操作:
- 拷贝 jmx 文件并分发:master 节点会将本地的 jmx 文件(测试计划文件)拷贝并分发到连接到指定网络(jmeter_net)的所有 slave 节点上;
- 执行测试脚本:slave 节点拿到脚本后,以命令行模式启动并执行脚本。由于每个 slave 机器拿到的脚本都是一样的,所以如果 jmx 脚本为 50 个线程跑 3 分钟,那么实际并发就是 50×3=150 个线程并发跑 3 分钟。
- 收集结果并汇总:在执行过程中,slave 节点会将执行获得的数据结果传回 master 节点,master 节点收集所有 slave 节点的信息并汇总,这样 master 节点上就存在一份所有 slave 节点汇总的数据结果。
执行命令截图如下:
此时正在进行测试,测试完成后如下:
八、查看测试结果
此时,进入到 /root/jmx_file_dir 目录下,会有一个以当前时间命名的目录,里面存放的就是报告。
进入目录后,查看目录内容,有个 index.html 文件。
打开 index.html 可以看到具体的测试报告,如下图:
后续会继续跟大家分享 Jmeter 的使用和一些常用的插件,以及如何进行数据持久化,感谢大家的支持~~