使用Docker进行Jmeter分布式搭建

        大家好,随着技术的不断发展,对性能测试的要求也日益提高。在这样的背景下,如何利用 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 节点会执行以下操作:

  1. 拷贝 jmx 文件并分发:master 节点会将本地的 jmx 文件(测试计划文件)拷贝并分发到连接到指定网络(jmeter_net)的所有 slave 节点上;
  2. 执行测试脚本:slave 节点拿到脚本后,以命令行模式启动并执行脚本。由于每个 slave 机器拿到的脚本都是一样的,所以如果 jmx 脚本为 50 个线程跑 3 分钟,那么实际并发就是 50×3=150 个线程并发跑 3 分钟。
  3. 收集结果并汇总:在执行过程中,slave 节点会将执行获得的数据结果传回 master 节点,master 节点收集所有 slave 节点的信息并汇总,这样 master 节点上就存在一份所有 slave 节点汇总的数据结果。

执行命令截图如下:

此时正在进行测试,测试完成后如下:

八、查看测试结果

此时,进入到 /root/jmx_file_dir 目录下,会有一个以当前时间命名的目录,里面存放的就是报告。

进入目录后,查看目录内容,有个 index.html 文件。

打开 index.html 可以看到具体的测试报告,如下图:

后续会继续跟大家分享 Jmeter 的使用和一些常用的插件,以及如何进行数据持久化,感谢大家的支持~~

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/1424882.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

Linux上编译安装和卸载软件

在maven官网下载maven时候,看到maven-3.9.5这个版本有2份安装包,一个是binaries,一个是source binaries是已编译好的文件,可以直接使用的版本;source是源代码版本,需要自己编译 源码的安装一般由这三个步…

nn.BatchNorm中affine参数的作用

在PyTorch的nn.BatchNorm2d中,affine参数决定是否在批归一化(Batch Normalization)过程中引入可学习的缩放和平移参数。 BN层的公式如下, affine参数决定是否在批归一化之后应用一个可学习的线性变换,即缩放和平移。具…

信息系统项目管理师0601:项目立项管理 — 考点总结(可直接理解记忆)

点击查看专栏目录 项目立项管理 — 考点总结(可直接理解记忆) 1.项目建议书(又称立项申请)是项目建设单位向上级主管部门提交项目申请时所必须的文件,是对拟建项目提出的框架性的总体设想。在项目建议书批准后,方可开展对外工作(掌握)。 2.项目建议书应该包括的核心内…

k8s 二进制安装 详细安装步骤

目录 一 实验环境 二 操作系统初始化配置(所有机器) 1,关闭防火墙 2,关闭selinux 3,关闭swap 4, 根据规划设置主机名 5, 做域名映射 6,调整内核参数 7, 时间同步 三 部署 dock…

redis7基础篇2 redis的3种模式(主从,哨兵,集群)模式

一 主从复制模式 1.1 主从模式 主从模式: 主机可以读,写,重机只能写操作。 主机shutdown后,从机上位还是原地待命:从机不动,原地待命,数据正常使用,等待主机重启归来。 主机shu…

【Docker学习】查询容器镜像的docker search

这个命令是使用Docker的必备技能。我们使用的各种官方镜像,一般都能通过这个命令找到。 命令: docker search 描述: 在Docker Hub上查找镜像。Docker Hub是为开发者和开源贡献者设计的容器镜像注册中心,它允许用户查找、使用和…

《天空之城》观后感

曾经很长一段时间都着迷于《天空之城》这段旋律,一遍一遍不厌其烦地听,静谧而温馨、豪迈却苍凉,各种复杂的感受随着起伏的音符流淌进心里。多年之后才知道这首曲子出自宫崎骏的同名动画电影。说来也有意思,似乎大多数人是通过电影…

TypeScript中的泛型(Generics)

TypeScript中的泛型(Generics) 在前面的几篇文章中,我们了解了TypeScript的类、接口和基本的数据类型系统。本文将重点介绍TypeScript中的泛型,这是一种强大的工具,它允许我们创建可重用的组件,同时保持类…

AI网络爬虫:用kimi提取网页中的表格内容

一个网页中有一个很长的表格,要提取其全部内容,还有表格中的所有URL网址。 在kimi中输入提示词: 你是一个Python编程专家,要完成一个编写爬取网页表格内容的Python脚步的任务,具体步骤如下: 在F盘新建一个…

三.使用HashiCorp Vault工具管理数据库

三.ubuntu安装使用HashiCorp Vault工具管理数据库 HashiCorp Vault 是一个基于身份的秘密和加密管理系统。机密是您想要严格控制访问的任何内容,例如 API 加密密钥、密码和证书。Vault 提供由身份验证和授权方法门控的加密服务。使用 Vault 的 UI、CLI 或 HTTP API,可以安全…

SAP_ABAP-思考篇

作为一个SAP十年左右的从业者,其实我很清楚,我自身的能力,确实是很多东西都会一点,但是没有一样是精通的。坦白来说,我的个人简介里,虽然也不算夸大,但我估计有些新手小白看着可能会觉得还挺厉害…

VS2022如何添加现有项

以 想在队列里,使用堆栈的.c,.h文件 为例 目录 1.复制堆栈的.c,.h文件 ​编辑 2.打开队列所在项目的文件夹 3.粘贴堆栈的.c,.h文件 4.在头文件和源文件添加相应的堆栈的.c,.h文件 1.复制堆栈的.c,.h文件…

【智能算法】清道夫优化算法(CFO)原理及实现

目录 1.背景2.算法原理2.1算法思想2.2算法过程 3.结果展示4.参考文献5.代码获取 1.背景 2024年,W Zhang受到清道夫自然行为启发,提出了清道夫优化算法(Cleaner Fish Optimization Algorithm, CFO)。 2.算法原理 2.1算法思想 CF…

git常用命令及其ignore文件

1.git本地操作命令 # 查看git的版本 git --version # 生成空的本地仓库 git init # 将文件添加到暂存区 git add 文件 # 将暂存区里的文件提交到本地仓库 git commit -m "描述"2.git远程仓库命令 # 添加远程仓库 git remote add origin http://192.168.1.130:9000/…

开源的图形化Windows软件安装升级方案:WingetUI

WingetUI:简化数字生活,WingetUI让软件管理轻松便捷- 精选真开源,释放新价值。 概览 WingetUI是在GitHub上开发的一个实用工具,专为Windows用户设计,旨在为常见的命令行包管理工具(如Winget、Scoop、Pip、…

AI图书推荐:ChatGPT 和Power BI驱动未来金融投资变革

《ChatGPT 和Power BI驱动未来金融变革》(The Future of Finance with ChatGPT and Power BI)由James Bryant和Aloke Mukherjee撰写,探讨了ChatGPT和Power BI在金融领域的应用。 主要特点: - 使用ChatGPT自动化Power BI&#xff…

基于振幅跟踪技术监测Inylchek冰川(吉尔吉斯斯坦)的冰流表面速度

冰川是重要的淡水资源,Inylchek冰川是世界上最长的冰川之一,60km长,有南北两个分支,海拔3000-4000米,最小坡度2。 2007年8月24日的Landsat5数据上的Inylchek冰川 为了监测冰川的运动,本研究获取了高重访周…

代码随想录算法训练营第五十四天

第二题我看了很久还是没太明白,我发现理解动规有一点点吃力了啊,努努力。 392.判断子序列 总感觉在不等于的时候,应该是dp[i][j] dp[i-1][j-2]; 这里其实按他那个图会更好理解一点。 class Solution { public:bool isSubsequence(string s, …

C++ I/O流(一)——输出流

一、IO流概念 IO流可分为输入流和输出流,用于从设备(如键盘、文件、网络等)读取数据或向设备写入数据。C++标准库提供了丰富的IO流类,包括iostream、fstream、stringstream等,分别用于处理控制台输入输出、文件输入输出和字符串流操作。 读操作:输入流中读取数据到程序中…

代码随想录--链表--反转链表

题目 题意:反转一个单链表。 示例: 输入: 1->2->3->4->5->NULL 输出: 5->4->3->2->1->NULL 思路 如果再定义一个新的链表,实现链表元素的反转,其实这是对内存空间的浪费。 其实只需要改变链表的next指针的…