使用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.rhkb.cn/news/328741.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

线性模型之岭回归的用法

实战:使用岭回归模型 完整代码: import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.datasets import make_regression from sklearn.model_selection import train_test_split fro…

3D Tiles资源大全

本文汇总整理3D Tiles相关的各种资源,包括查看器、生成器、示例数据集、教程、演示等。 1、3D Tiles特色演示 注意:这些演示是基于 CesiumJS 1.87.1 Release 发布的,其中包括对 3D Tiles Next 扩展的实验性支持。这些演示中显示的大多数功能现…

2024数维杯数学建模C题思路代码

2024年数维杯&电工杯思路代码在线文档​https://www.kdocs.cn/l/cdlol5FlRAdE 这道题想要做出好的结果,必须要结合插值法和分布函数来做,主要还是因为勘探点太少,直接用插值法效果不太好,以下是我做的,函数分布可…

Qwen 开源标杆

Qwen的博客 在线体验Qwen开源版本、非常丝滑 不算量化、已经开源的Qwen1.5 版本有9个: 0.5B、1.8B、4B、7B、14B、32B、72B、110B、MoE-A2.7B 闭源已经发展到 Qwen-Max-0428、网页端从2.1升级到2.5 Qwen API详情 一些记录: 1、Qwen1.5 110B&#x…

FPGA相关论文阅读

一、Achieving 100Gbps Intrusion Prevention on a Single Server 论文名称中文翻译:在单台服务器上实现100Gbps吞吐量的入侵防御检测。 文章中的Mixed-1和Norm-1 二、Distributed Password Hash Computation on Commodity Heterogeneous Programmable Platforms…

虚拟化技术 使用vSphere Web Client管理ESXi主机

一、实验内容 通过vSphere Web Client将ESXi主机连接到iSCSI共享存储通过vSphere Web Client,使用共享存储创建虚拟机并安装windows 2008 R2操作系统通过vSphere Web Client,为虚拟机创建快照 二、、实验主要仪器设备及材料 安装有64位Windows操作系统…

括号生成[中等]

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

山东大学机器学习实验lab9 决策树

山东大学机器学习实验lab9 决策树 所有公式来源于<<机器学习>>周志华github上有.ipynb源文件 修改&#xff1a; 2024 5.15 添加了一些Node属性&#xff0c;用于标记每个Node使用的划分feature的名称&#xff0c;修改后的版本见 github Node 类 构造函数 初始化…

ubuntu升级python

添加Python官方PPA源 sudo add-apt-repository ppa:deadsnakes/ppa 执行会显示各个版本ubuntu可以安装哪些python版本 更新软件包索引 sudo apt update 安装需要版本Python sudo apt install python3.11 检查Python版本: which python11 /usr/bin/python3.11 设置为系统默认Pyt…

命令行中,Python 想使用本地环境,但总是显示为Anaconda的虚拟环境

电脑环境 Python 本地环境&#xff08;Python3.9.5&#xff09;Anaconda 虚拟环境&#xff08;Python3.8.8&#xff09; 遇到的问题 在cmd 中&#xff0c;我想在本地环境使用 Python、pip &#xff0c;但它却是一直识别成Anaconda的虚拟环境。 解决方法 环境变量配置中&am…

Python | Leetcode Python题解之第91题解码方法

题目&#xff1a; 题解&#xff1a; class Solution:def numDecodings(self, s: str) -> int:n len(s)# a f[i-2], b f[i-1], c f[i]a, b, c 0, 1, 0for i in range(1, n 1):c 0if s[i - 1] ! 0:c bif i > 1 and s[i - 2] ! 0 and int(s[i-2:i]) < 26:c aa,…

汇中 SCL-61D2超声水表汇中通讯协议

RS-485串行通讯接口设置表 通用代码注释 读取正向仪表数据 DD的内容为 通讯示例 主机命令&#xff1a;2A 41 4A 仪表响应&#xff1a;26 41 4A 00 00 13 63 00 00 07 72 00 00 10 34 00 33 读取负向仪表数据&#xff1a;&#xff08;单向型仪表无此命令&#xff09; DD的内容…

redis-stack部署概要

第一步&#xff0c;下载redis-stack 下载链接&#xff1a;Downloads - Redis 第二步&#xff0c;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 第三步&#xff0c;编辑etc下的redis…

【Spring security】Note01-pig登录验证过程

&#x1f338;&#x1f338; pig 登录验证 &#x1f338;&#x1f338; 一、大概执行顺序&#xff0c;便于理解 pig spring-security 二、执行过程分析 请求拦截&#xff1a; 当客户端发送请求时&#xff0c;Spring Security 的过滤器链会首先拦截该请求。过滤器链中的每个…

数据结构与算法—顺序表

目录 一、线性表 二、顺序表概念 三、实现顺序表 1、声明结构体 2、初始化 3、打印数据 4、销毁 5、尾插&头插 尾插 判断是否扩容 头插 6、尾删&头删 尾删 头删 7、 指定位置插入元素 8、 删除指定位置元素 9、 查找指定元素位置 10、修改指定位置元…

angular13 自定义组件全项目都可用 自存

1.定义自定义组件 使用命令创建一个组件 但删除它在你的module里的声明&#xff0c;因为会报错只能引用一次 在本组件中创建一个module文件&#xff0c;引入刚才的组件component.ts import { NgModule } from angular/core; import { CommonModule } from angular/common; im…

简化路径[中等]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个字符串path&#xff0c;表示指向某一文件或目录的Unix风格 绝对路径 &#xff08;以/开头&#xff09;&#xff0c;请你将其转化为更加简洁的规范路径。在Unix风格的文件系统中&#xff0c;一个点.表示当前目录本身&#x…

vue3 自定义组件

在项目中&#xff0c;我们会遇到一些没有现成的组件&#xff0c;那这个时候我们就需要自己去写一个满足我们需求的组件。 比如&#xff0c;我需要一个上下排布&#xff0c;上面显示标题&#xff0c;下面显示内容的组件。封装完成后方便复用。 1、布局组件 我定义一个上下结构的…

2024生日快乐祝福HTML源码

源码介绍 2024生日快乐祝福HTML源码&#xff0c;源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c; 源码截图 源码下载 2024生日快乐祝福HTML源码

Gradio 案例——将 dicom 文件转为 nii文件

文章目录 Gradio 案例——将 dicom 文件转为 nii文件界面截图依赖安装项目目录结构代码 Gradio 案例——将 dicom 文件转为 nii文件 利用 SimpleITK 库&#xff0c;将 dicom 文件转为 nii文件更完整、丰富的示例项目见 GitHub - AlionSSS/dcm2niix-webui: The web UI for dcm2…