使用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 的使用和一些常用的插件,以及如何进行数据持久化,感谢大家的支持~~

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

如何组织 Vue 项目

介绍 在启动 Vue 项目时,思考项目结构至关重要。主要考虑因素是预期项目的规模。在本篇博文中,我将探讨适用于不同规模 Vue 项目的各种结构。这个考虑与康威定律相吻合: “设计系统的组织受限于产生这些组织沟通结构的设计。” - 梅尔康威 基…

平均工资数据分析之回归

链接: R语言实战——中国职工平均工资的变化分析——相关与回归分析 1、模型诊断和评估的方法 1. 残差分析 1、残差图 (Residual Plot):用于检查残差是否存在非随机模式。理想情况下,残差应随机分布在零附近。 2、Q-Q 图 (Quantile-Quantile Plot)&am…

redis-stack部署概要

第一步,下载redis-stack 下载链接:Downloads - Redis 第二步,redis安装包解压缩 gzip -d redis-stack-server-7.2.0-v10.rhel8.x86_64.tar.gz tar -xvf redis-stack-server-7.2.0-v10.rhel8.x86_64.tar 第三步,编辑etc下的redis…

高性能日志库go-logger2.0.4—支持slog日志文件切割

go-logger v2.0.4 发布 该版本主要支持go原生日志库 log/slog 的日志文件切割,压缩等功能。 log/slog 库是 Go 语言用于结构化日志记录的一个强大工具,它旨在提升日志的管理和分析能力,同时保证代码的简洁性和执行效率。随着 Go 语言生态的…

简单聊聊分布式和集群

前言 分布式和集群,我们都听的比较多,分布式系统和集群的概念对于刚进入职场的小伙伴可能不是很清楚,这篇文章我们就一起看看两者到底是什么,有什么区别。 什么是分布式系统? 先看下书面解释: 分布式系统…

学习笔记-C++

目录 1、何为常量 2、关键字 3、实型 4、水平制表符 5、string字符串 6、C中的三目运算符 7、随机数种子 8、结构体 9、各的区 10、引用 11、函数默认参数 12、函数占位参数 13、函数重载 14、私有属性 15、让另一个类作为本类的成员 16、声明和实现的文件…

正点原子[第二期]Linux之ARM(MX6U)裸机篇学习笔记-15.7讲 GPIO中断实验-编写按键中断驱动

前言: 本文是根据哔哩哔哩网站上“正点原子[第二期]Linux之ARM(MX6U)裸机篇”视频的学习笔记,在这里会记录下正点原子 I.MX6ULL 开发板的配套视频教程所作的实验和学习笔记内容。本文大量引用了正点原子教学视频和链接中的内容。…

初识Django

day15 初识Django Python知识点:函数、面向对象。前端开发:HTML、CSS、JavaScript、jQuery、BootStrap。MySQL数据库。 Python的Web框架: Flask,自身短小精悍 第三方组件。Django,内部已集成了很多组件 第三方组件。…

GM812条码模块的产品说明

1 模块尺寸 引脚定义 (单位:mm) 接口定义:规格 1.25*6Pin 接口说明: a) UART 缺省波特率为 9600bps,数据格式:8 位数据位,1 位停止位,无校验位。 b) 如果上位机是 MCU(3.3V&#x…

Java面试八股之Java中有哪些原子类,原理是什么

Java中有哪些原子类,原理是什么 AtomicInteger 和 AtomicLong: 用于对整数(int)和长整数(long)进行原子操作。 原理:它们内部封装了一个整型或长整型变量,并通过使用Unsafe类提供…

括号生成[中等]

优质博文:IT-BLOG-CN 一、题目 数字n代表生成括号的对数,请你设计一个函数,用于能够生成所有可能的并且 有效的 括号组合。 示例 1: 输入:n 3 输出:["((()))","(()())","(())(…

项目管理-案例重点知识(干系人管理)

项目管理:每天进步一点点~ 活到老,学到老 ヾ(◍∇◍)ノ゙ 何时学习都不晚,加油 四、干系人管理 案例重点知识 干系人管理 案例 重点内容: (1)权力利益方格、权力影响方格&#xff…

GPT-4o“成精了”:推测技术原理,附送“美国湾区”小道消息

原创:谭婧 如果你能跟上技术发展,那大多数技术提升都是按部就班, 偶而会有突破性进展。 如果你仅仅吃瓜,那OpenAI的所有新闻, 你都可以写成: “改写历史”“干翻所有”“颠覆世界”。 真的颠覆世界了吗&…

ue引擎游戏开发笔记(41)——行为树的建立(2)--丰富ai行为:巡逻后返回原处

1.需求分析: 就敌人ai而言,追踪到敌人有可能丢失目标,丢失目标后应该能返回原来位置,实现这一功能。 2.操作实现: 1.思路:利用clear value函数,禁用掉当前的追踪功能,执行之后的返…

Git项目管理——提交项目和版本回退(二)

个人名片: 🎓作者简介:嵌入式领域优质创作者🌐个人主页:妄北y 📞个人QQ:2061314755 💌个人邮箱:[mailto:2061314755qq.com] 📱个人微信:Vir2025WB…

SSL证书对于网络安全的重要作用

SSL证书是一种数字证书,它通过加密技术确保了客户端(如浏览器)与服务器之间的数据传输安全。当一个网站安装了SSL证书后,用户在浏览器地址栏中可以观察到HTTPS(超文本传输安全协议)前缀和挂锁图标&#xff…

聚鼎科技:装饰画行业到底怎么样

在当代社会,随着人们审美水平的提升和生活品质的追求,装饰画行业呈现出蓬勃的发展态势。这一行业不仅关系到文化艺术的传承与创新,也与市场经济紧密相连,其前景值得深入探讨。 装饰画行业的市场潜力巨大,它贯穿于家居装…

Git使用(4):分支管理

一、新建分支 首先选择Git -> Branches... 然后选择 New Branch,输入新分支名称,例如dev。 可以看到右下角显示已经切换到新建的dev分支了。 push到远程仓库,可以看到新添加的分支。 二、切换分支与合并分支 为了演示合并分支&#xff0c…

【opencv】答题卡判分实验

实验环境: anaconda、jupyter notebook 实验用的包:numpy、matplotlib、opencv 实验的目的还是以熟悉图像的透视变换、轮廓特征提取为主要目的 关于如何判断答题卡被选项:通过几个覆盖备选项的掩膜与原二值图像想与,最终整个图像…

Python100个库分享第23个—wordcloud(词云图)

目录 专栏导读库的介绍库的安装基础使用1:将TXT文本转为词云图基础使用2:使用自定义字体和形状基础使用3:中文词云图停用词(中英文版)-代码是中文版总结 专栏导读 🌸 欢迎来到Python办公自动化专栏—Python处理办公问题&#xff0…