赞
踩
大家好,随着技术的不断发展,对性能测试的要求也日益提高。在这样的背景下,如何利用 Docker 来巧妙地搭建 Jmeter 分布式成为了关键所在。现在,就让我们开启这场探索之旅,揭开其神秘的面纱。前段时间给大家分享了关于 Locust 性能测试相关的知识,其中就有 Locust 与 Jmeter 两关工具的对比,各有优劣,大家可以根据自己的业务和场景,选择更适合自己的工具,毕竟,工具只是手段,测试思路才是重中之重,关于 Locust 脚本编写与分布式搭建,大家可以参考:
在工作中,我们经常需要对一些关键接口进行高 QPS 的压测。JMeter 是使用 Java 语言开发的,当创建一个线程(虚拟用户)时,JVM 会默认为每个线程分配 1M 的堆栈内存空间。由于单台试压机的配置限制,很难实现过高的并发。因此,我们可以通过实现 JMeter 的分布式,整合多台主机的硬件资源,从而同时对被测试接口进行压力测试。
在 Jmeter 分布式测试环境中,有两个非常重要的角色:Master 和 Slaves
也被称为控制机或主节点,主要负责以下任务:
也被称为从节点或负载机,主要负责执行压测任务,它们的具体职责包括:
- docker pull runcare/jmeter-master
- docker pull runcare/jmeter-slave
分别执行上述命令进行master与slaves镜像下载,如下图:
下载完成后,查看镜像:
Docker 虚拟网络是 Docker 为应用程序创造的虚拟环境的一部分,它能让应用从宿主机操作系统的网络环境中独立出来,形成容器自有的网络设备、IP 协议栈、端口套接字、IP 路由表、防火墙等与网络相关的模块。
Docker 虚拟网络的作用主要有以下几点:
在 Jmeter 分布式中使用 Docker 虚拟网络具有以下一些好处:
创建虚拟网络,名称为 jmeter_net。
docker network create jmeter_net
创建完成后,查看虚拟网络列表
docker network ls
假如有三台服务器作为 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 容器日志查看所有 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
此处编写一个比较简单的脚本。
保存脚本名称 test_baidu.jmx,并存放在 /root/jmx_file_dir 目录下,下面我们会将 /root/jmx_file_dir 这个目录挂在到 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 节点会执行以下操作:
执行命令截图如下:
此时正在进行测试,测试完成后如下:
此时,进入到 /root/jmx_file_dir 目录下,会有一个以当前时间命名的目录,里面存放的就是报告。
进入目录后,查看目录内容,有个 index.html 文件。
打开 index.html 可以看到具体的测试报告,如下图:
后续会继续跟大家分享 Jmeter 的使用和一些常用的插件,以及如何进行数据持久化,感谢大家的支持~~
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。