基于Jmeter的分布式压测环境搭建及简单压测实践

写在前面

平时在使用Jmeter做压力测试的过程中,由于单机的并发能力有限,所以常常无法满足压力测试的需求。因此,Jmeter还提供了分布式的解决方案。本文是一次利用Jmeter分布式对业务系统登录接口做的压力测试的实践记录。按照惯例,在正式开始前,先简单介绍一下本文大纲:

  • Jmeter集合点用法
  • Jmeter命令行参数详解
  • Jmeter分布式部署方案
  • Jmeter分布式调度原理
  • Jmeter分布式部署过程
  • Jmeter分布式压测业务系统登录接口实践
一、Jmeter集合点用法

集合点是使用Jmeter进行压力测试中一个绕不开的话题。

集合点通俗地理解就是,例如要模拟100个并发用户,集合点会将这100个线程集结完毕后,统一释放,同时对系统进行施压。Jmeter中可以通过同步定时器 Synchronizing Timer 来完成:

同步定时器中”模拟用户组的数量“与线程组的线程数量的关系:

1.当模拟用户组的数量 = 线程组的线程数量

例如数量都是5,那么运行测试,Jmeter会等到5个用户同时准备好后,并发发起请求;

2.当模拟用户组的数量 < 线程组的线程数量

① 未设置超时时间

例如:模拟用户为5,线程数量为8,那么在运行Jmeter后,Jmeter会先同时发起5个请求,剩下3个用户不足集合点的数量5,由于又没有设置超时时间,因此达不到集合点的数量要求,Jmeter就会一直处于等待状态;

② 已设置超时时间

例如:模拟用户为5,线程数量为8,超时时间设置为3000(以毫秒为单位,即3秒)

那么在运行Jmeter后,Jmeter会先同时发起5个请求,由于剩下3个用户不足集合点要求的数量5,因此会超时等待3秒钟,在3秒钟后再同时发起剩下的3个用户的请求,共8个用户;

3.当模拟用户组的数量 > 线程组的线程数量

① 未设置超时时间

例如:模拟用户为8,线程数量为5,超时时间为0

由于设置的模拟用户数量为8,即集合点数量为8,而线程组的总用户数只有5,因此达不到集合点数量要求,且又没有设置超时时间,所以Jmeter会一直处于等待状态,不会发起任何请求,如下图所示:

② 已设置超时时间

例如:模拟用户为5,线程数量为8,超时时间设置为3000(以毫秒为单位,即3秒)

由于设置的模拟用户数量为8,即集合点数量为8,而线程组的总用户数只有5,因此达不到集合点数量要求,但是设置了超时时间为3秒,所以Jmeter会在3秒后,同时发起5个(用户)请求,如下图所示:

二、Jmeter命令行参数详解
参数作用
-n表示在命令行模式下运行 JMeter
-t指定脚本文件
-R指定从节点(agent)执行测试,多个ip用逗号隔开
-r表示启动全部agent
-f表示每次都会清空前一次的执行结果,写入新的结果
-l生成测试结果文件,默认以 jtl 结尾
-e生成测试报告
-o指定生成测告的位置,必须为空
-g指定已存在的jtl结尾的测试文件生成报告

常见用法:

 
  1. ./jmeter.bat -n -t test.jmx # 以命令行方式运行test.jmx脚本

  2. ./jmeter.bar -n -t test.jmx -l test.jtl # 以命令行方式运行test.jmx脚本,并生成测试结果文件test.jtl

  3. ./jmeter.bar -n -t test.jmx -f -l test.jtl -e -o report # 以命令行方式运行test.jmx脚本,每次生成结果前先清空test.jtl,同时在report目录下生成测试报告

  4. ./jmeter.bar -n -t test.jmx -l test.jtl -R 192.168.1.122 # 指定远程主机192.168.1.122执行测试

三、Jmeter分布式部署方案
主机IP地址
Master主节点(Windows)192.168.1.131
Slave从节点-1(Linux)192.168.1.121
Slave从节点-2(Linux)192.168.1.122
Slave从节点-3(Linux)192.168.1.123

注意事项:

  • 主节点及各个从节点机器必须提前安装好Java环境;
  • 主节点及各个从节点的Jmeter版本保持统一;
  • master会在发送测试计划时将jmx的脚本文件发送到各个从节点,因此,脚本文件不用手动上传到各个从节点;
  • 但是master不会将外部文件一起发送,所以在测试中用到的CSV等参数化文件,需要把CSV等文件手动上传到各个从节点,最好都放置在bin目录下,Jmeter会直接从bin目录下开始查找;
四、Jmeter分布式调度原理

1.各节点作用
  • 主节点:主要负责管理从节点(负载机)、分配调度任务(脚本分发)、收集测试结果
  • 从节点:执行测试任务,模拟并发请求
2.工作流程

① 主节点负责将测试任务、测试脚本下发给各个从节点;

② 从节点接收到测试任务后,开始驱动各自环境上的Jmeter执行测试任务、模拟并发请求;

③ 从节点执行完成后会将测试结果回传给主节点;

④ 最后主节点将各个从节点的收集回来的测试结果进行展示;

五、Jmeter分布式部署过程
1.主节点部署

① 编辑主节点jmeter.properties配置文件

  • 第268行,remote_hosts添加从节点主机地址,多个从节点用逗号隔开(注意:不同版本可能存在差异)
  • 第272行,为主节点端口号,如有端口占用,可手动修改
  • 第345行,server.rmi.ssl.disable由false改为true(关闭ssl)

② 主节点启动jmeter-server服务

Windows环境下直接点击运行Jmeter的bin目录下的jmeter-server.bat即可,启动成功会出现如下提示:

2.从节点部署

① 将Jmeter压缩包上传到各个从节点并解压

从节点均为Linux环境,解压命令为:

  1. unzip apache-jmeter.zip

② 修改jmeter.properties配置文件

  • 第345行,server.rmi.ssl.disable由false改为true(关闭ssl)

③ 启动jmeter-server服务

 
  1. chmod -R +x bin # jmeter-server、jmeter文件都需要执行权限,可以简单粗暴使用chmod -R参数赋予整个bin目录执行权限

  2. ./jmeter-server # 启动jmeter-server服务

启动成功会出现如下提示:

3.测试主节点与从节点的连通性

可以通过Jmeter工具-运行-远程启动,选择一个从节点;也可以使用命令行-R参数指定一个从节点运行:

如下图所示,Starting...表示主节点已将任务下发到指定的从节点,从节点开始执行测试任务

4.Jmeter分布式部署常见问题及报错解决

1)启动远程主机,提示“Engine is busy - please try later”

原因:本地或者远程负载机,未正常关闭

解决:杀掉进程重新启动(可以观察主节点及从节点的jmeter-server日志,如果只有Starting,没有Finished,那么大概率是这台机器出现了问题)

2)主节点发起测试后未接收到结果数据

如:执行成功后,察看结果树无数据,主节点及从节点也没有任何报错

原因:测试脚本中有参数化,远程节点上参数化csv文件跟本地测试中设置的目录不一致,或从节点上缺少csv文件

解决:将csv文件分别上传一份到各个从节点,csv文件最好设置相对路径,不要设置绝对路径,将csv文件存放在bin目录下

3)Jmeter启动从节点运行测试报错“connection refused”

原因:从节点未启动jmeter-server服务

解决:各个从节点均启动jmeter-server服务

六、Jmeter压测业务系统登录接口实践
  • 最大并发量:和我们业务系统负责人交流后,得知系统理论上支持6000~7000个左右的用户同时并发登录是没有问题的;
  • 测试的目标:测试出业务系统是否如他提供的数据、支持那么大的用户并发登录;
  • 实测数据:3台负载机,每台启动500个线程,共1500个用户并发,测试结果如下,各个负载机模拟的用户均登录正常、无报错,被测业务系统所在服务器内存、CPU均无大的波动;

  • 升压:并发用户数量1500、2100左右,系统响应都比较稳定,当并发用户量达到每台1000,一共3000个用户同时请求时,部分用户登录会返回500,总体失败率在3%左右(预测当并发用户数达到更大规模4000、5000、6000,失败的比例还会增大)

小结
  • 以上就是利用Jmeter实现分布式压测的一次实践,确切的说应该是初探;
  • 在压力测试过程中,CPU和内存的动态变化我并没有做详细的监控,后续准备借助JMeter+InfluxDB+Grafana的监控组合来可视化监控测试过程;
  • 性能测试是一个庞大的工程和命题,性能测试工具仅仅是实现性能测试的技术手段,会使用性能测试工具不代表就掌握了性能测试;
  • 所有使用性能测试工具的目的都只是为了模拟压力的发起,在性能测试过程中,工具仅仅起到脚本开发、场景实现、测试执行等作用,而性能测试还包括需求获取、场景设计、结果分析和调优等诸多环节,最终还是要靠人来实现;
  • 尤其是性能瓶颈分析和调优,除了依赖性能测试结果外,还需要依赖于人的强大的性能测试功底,以及对业务、对系统架构的了解

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

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

相关文章

代码随想录算法训练营day41|动态规划04

最后一块石头的重量|| 返回剩余最后一块石头石头最小的可能重量&#xff0c;那么就应该最后剩余的两块石头尽量都等于或接近总重量的一半&#xff0c;这样剩下的就是一半的质量 目标和 给定一个非负整数数组&#xff0c;a1, a2, …, an, 和一个目标数&#xff0c;S。现在你有…

Python+Flask实现随机选谷票游戏

西方曾进行一项著名的投资随机性实验&#xff0c;对比基金经理与猴子在选股上的表现。 实验方法&#xff1a;主持人提供一系列股票&#xff0c;基金经理依靠其专业知识&#xff08;如财务报表、行业趋势、产品市场及公司文化与管理层分析等&#xff09;进行筛选&#xff1b;而…

【Python数据可视化分析实战】数据爬取—京东手机品牌信息数据爬取和数据分析与可视化

大数据分析设计方案 1.数据集来源&#xff1a;https://search.jd.com 2.实现思路&#xff1a; &#xff08;1&#xff09;数据爬取 首先&#xff0c;我们需要从京东平台上采集手机品牌的相关数据。可以通过网络爬虫或API接口等方式获取数据。为了保证数据的完整性和准确性&…

使用 TensorFlow 实现 ZFNet 进行 MNIST 图像分类

ZFNet&#xff08;ZF-Net&#xff09;是由 Matthew Zeiler 和 Rob Fergus 提出的卷积神经网络架构&#xff0c;它在图像分类任务中取得了显著的效果。它在标准卷积神经网络&#xff08;CNN&#xff09;的基础上做了一些创新&#xff0c;例如优化了卷积核大小和池化策略&#xf…

11.15 HTML

传统路线 HTML、CSS、JS AjaxJQueryMySQLJDBCServletJSPEL&JSTLCookieSessionFilterServlet案例MybatisSpringSpringMVCSpringBoot 全新路线 HTM、CSS、JSAjax、AxiosVue、Element前端工程化 vue脚手架MavenSpringBoot基础 基于SpringBoot进行讲解Spring的IOC&#xff…

打造旅游卡服务新标杆:构建SOP框架与智能知识库应用

随着旅游业的蓬勃兴起&#xff0c;旅游卡产品正逐渐成为市场的焦点。为了进一步提升服务质量和客户体验&#xff0c;构建一套高效且标准化的操作流程&#xff08;SOP&#xff09;变得尤为重要。本文将深入探讨如何构建旅游卡的SOP框架&#xff0c;并介绍如何利用智能知识库技术…

Java 简单家居开关系统

1.需求&#xff1a; 面向对象编程实现智能家居控制系统&#xff08;简单的开关&#xff09; 2.实现思路 1.定义设备类&#xff1a;创建设备对象代表家里的设备 JD类&#xff1a; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor;D…

Github客户端工具github-desktop使用教程

文章目录 1.客户端工具的介绍2.客户端工具使用感受3.仓库的创建4.初步尝试5.本地文件和仓库路径5.1原理说明5.2修改文件5.3版本号的说明5.4结合码云解释5.5版本号的查找 6.分支管理6.1分支的引入6.2分支合并6.3创建测试仓库6.4创建测试分支6.5合并分支6.6合并效果查看6.7分支冲…

3D Gaussian Splatting的全面理解

1.概述 高斯展开是一种表示 3D 场景和渲染新视图的方法,在“用于实时辐射场渲染的 3D 高斯展开” 中介绍。它可以被认为是类似 NeRF 的模型的替代品,就像过去的 NeRF 一样,高斯飞溅导致了许多新的研究工作,他们选择将其用作各种用例的 3D 世界的底层表示。那么它有什么特别…

Arcgis地图实战三:自定义导航功能的实现

文章目录 1.最终效果预览2.计算两点之间的距离3.将点线画到地图上4.动态展示点线的变化5.动态画线6.动态画点 1.最终效果预览 2.计算两点之间的距离 let dis this.utilsTools.returnDisByCoorTrans(qdXYData, zdXYData, "4549")当距离小于我们在配置文件中预设置的…

【Mysql】Mysql的多表查询---多表联合查询(中)

1、外连接查询 外连接 查询分为左外连接&#xff08;left outer join&#xff09;, 右外连接查询&#xff08;right outer join&#xff09; &#xff0c;满外连接查询&#xff08;full outer join&#xff09;. 注意&#xff1a;oracle 里面有full join &#xf…

Linux:进程状态

文章目录 前言一、初识fork1.1 fork函数的介绍1.2 fork出的子进程存在形式1.3 写时拷贝 二、进程的状态2.1 Linux内核源代码2.2 理解内核链表(重要)2.3 运行状态2.4 阻塞状态2.5 挂起状态 三、Z&#xff08;zombie&#xff09;状态 &#xff0c;僵尸进程四、 孤儿进程总结 前言…

qml显示加载嵌入QWidget窗口

本篇博客介绍如何在qml界面里显示QWidget窗口,开发环境Qt6.5.3 qml. 视频讲解:https://edu.csdn.net/learn/40003/654001?spm=3001.4143 qml和QWidget是两套独立的开发方式,二者的窗口可以相互嵌套显示,本篇博客介绍把QWidget窗口封装为动态库,然后在QML的窗口里显示出来…

【MySQL】多表查询

5. 多表查询 5.1 多表关系 项目开发中&#xff0c;在进行数据库表结构设计时&#xff0c;会根据业务需求及业务模块之间的关系&#xff0c;分析并设计表结构&#xff0c;由于业务之间相互关联&#xff0c;所以各个表结构之间也存在着各种联系&#xff0c;基本上分为三种&#…

2024-11-16 串的存储结构

一、顺序存储。 1.首先定一个静态数组&#xff0c;然后定义i记录串的实际长度。&#xff08;缺点&#xff1a;长度不可变&#xff09; 2.使用malloc申请动态空间&#xff0c;定义指针指向串的地址。&#xff08;需手动ferr&#xff09; 方案一&#xff1a; 数组末尾记录长度 …

nodejs21: 快速构建自定义设计样式Tailwind CSS

Tailwind CSS 是一个功能强大的低级 CSS 框架&#xff0c;只需书写 HTML 代码&#xff0c;无需书写 CSS&#xff0c;即可快速构建美观的网站。 1. 安装 Tailwind CSS React 项目中安装 Tailwind CSS&#xff1a; 1.1 安装 Tailwind CSS 和相关依赖 安装 Tailwind CSS: npm…

Windows 安装Docker For Desktop概要

Windows 安装docker 下载部分的工作需要使用科学技术。如果没有可以联系博主发送已下载好的文件。 本文档不涉及技术的讲解&#xff0c;仅有安装的步骤。 准备工作 包含下载与环境准备&#xff0c;下载的文件仅下载&#xff0c;在后续步骤进行安装。 微软关于wsl的文档&…

对称加密算法DES的实现

一、实验目的 1、了解对称密码体制基本原理 2、掌握编程语言实现对称加密、解密 二、实验原理 DES 使用一个 56 位的密钥以及附加的 8 位奇偶校验位&#xff0c;产生最大 64 位的分组大小。这是一个迭代的分组密码&#xff0c;使用称为 Feistel 的技术&#xff0c;其中将加密…

三十八、Python(pytest框架-上)

一、介绍 框架&#xff08;framework&#xff09;&#xff1a;框架是为解决一类事情的功能集合。 pytest框架&#xff1a;pytest框架是单元测试框架&#xff0c;这是第三方框架想要使用必须要安装&#xff0c;可以使用pytest来作为自动化测试执行框架&#xff0c;用来管理测试…

《Django 5 By Example》阅读笔记:p165-p210

《Django 5 By Example》学习第6天&#xff0c;p165-p210总结&#xff0c;总计46页。 一、技术总结 1.bookmarks项目 (1)登录认证 作者这里使用的是Django自带的auth。 (2)上传头像 图片处理&#xff0c;使用Pillow。 (3)扩展user 扩展user模型与自带的user使用外键进行…