Jmeter系列(39)- Jmeter 分布式测试

本文涉及的产品
云防火墙,500元 1000GB
简介: Jmeter系列(39)- Jmeter 分布式测试

如果你想从头学习Jmeter,可以看看这个系列的文章哦

https://www.cnblogs.com/poloyy/category/1746599.html

 

为什么要做分布式


Jmeter 本身的局限性

  • 一台压力机的 Jmeter 默认最大支持 1000 左右的并发用户数(线程数),再大的话,容易造成卡顿、无响应等情况,这是受限于 Jmeter 其本身的机制和硬件配置(内存、CPU等)
  • 由于 Jmeter 是 Java 应用,对 CPU 和内存的消耗较大,在需要模拟大量并发用户数时,单机很容易出现 JAVA 内存溢出的错误,导致测试脚本本身就有瓶颈

 

JVM 堆内存的局限性

Java 应用的 jvm 堆内存 heap 受压力机硬件限制,虽然我们可以调整堆内存大小

 

cmd 启用 Jmeter GUI 时,也会有提示

increase Java Heap to meet your test requirements: Modify current env variable HEAP="-Xms1g -Xmx1g -XX:MaxMetaspaceSize=256m" in the jmeter batch file

翻译:增加 Java 堆内存来满足测试的要求

 

但是单机无法支撑数以万计大并发,此时,需要多个压力机进行分布式压力测试,这样性能瓶颈就不会是我们的压力机了

 

联想场景

  • 测试 5000 并发的场景,但单机只能支持 1000 并发无法达到 5000
  • 通过分布式(5 台机器起)可以模拟 5000 并发

 

分布式压测

Jmeter 支持分布式压测,将需要模拟的大量并发用户数分发到多台压力机,使 Jmeter 拥有更大的负载量,满足真实业务场景(高并发场景)

 

分布式的最终目的

  • 确保压力机不会出现性能瓶颈
  • 在后面进行性能分析时,不需要考虑压力机是否会导致性能瓶颈的主要原因之一

 

分布式原理


image.png

把上面的动图完整看完,就懂了,原理如下:

  1. Master 是控制机,Slaves 是多个压力机,Target 是被测系统
  2. 分布式测试中,Master 通过命令行将测试脚本分发给所有 Slave
  3. Slave 不需要启动 Jmeter GUI,通过 CLI 模式执行测试
  4. Slave 执行完后,会把结果回传给 Master
  5. Master 收集所有 Slave 的结果并汇总成一个结果集

 

注意

  • 压力机也可以叫:负载机、代理机、执行机、奴隶机、肉鸡....各种各样的名字,但他们都是 Slave
  • Master 也可以执行测试脚本,不执行只负责管理

 

场景类比

  • 一个测试部门有一个部门经理,五个测试小弟
  • 有个巨型测试任务由部门经理划分好模块后分发给五个测试小弟去测试
  • 五个小弟测试完,会各自发送测试报告给部门经理
  • 部门经理把所有测试报告汇总成一份,发给公司大佬看
  • 而部门经理可以参与测试,也可以不参与测试只负责管理部门

 

分布式专用术语认知


image.png


Master

  • 控制机
  • 运行JMeter GUI(控制测试)的机器

 

Slave

  • 压力机
  • 运行 jmeter-server 的机器
  • 它从 GUI 接收命令并将请求发送到目标系统

 

target

需要进行压力测试的 Web 服务器

 

实现分布式的前提条件


控制机和压力机的 jmeter 要一致

具体体现在

  • jmeter 版本要一致
  • jdk 主版本要一致(1.7、1.8...)
  • jmeter 脚本中,csv 文件要一致
  • jmeter 的插件要一致
  • 同一局域网,防火墙开放端口

 

jdk 版本一致

看主版本即可

image.png

csv 文件一致

主要是数据和路径要一致

如何保持一致可以参考这篇博客:https://www.cnblogs.com/poloyy/p/13189198.html

 

保证一致性方法

直接将控制机的 jmeter 压缩包移到每个压力机上解压使用

 

压力机配置


注意:压力机系统不限,可以是win、mac、linux

 

前置步骤

将控制机的 jmeter 压缩包发送到压力机,解压

 

修改 jmeter.properties(下面三步走)

进入 bin 目录

修改 server_port 端口

默认1009

可修改任意端口,但不能已被占用的哦

image.png


修改 server.rmi.port 端口

和 server_port 保持一致即可, 默认是会帮你保持一致的

image.png

设置 server.rmi.ssl.disable

默认 false,代表需要认证

设置为 true,减少不必要的麻烦

image.png

启动 jmeter-server 服务

仍然在 bin目录下哦

如果压力机是 linux 或 mac

./jmeter-server -Djava.rmi.server.hostname=压力机ip

 

如果是window

jmeter-server.bat -Djava.rmi.server.hostname=压力机ip

 

检查防火墙

  • 检查防火墙是否被关闭,防火墙会影响脚本执行和测试结构收集
  • 确认 server_port 的端口没有被占用以及需要对外开放,端口占用会导致压力机报错
  • 关于开放端口和关闭防火墙可以参考这篇博客:https://www.cnblogs.com/poloyy/p/12213297.html

 

控制机配置


修改 jmeter.properties(下面三步走)

修改 remote_hosts

image.png

  • 多个压力机之间用 , 隔开
  • 不同压力机端口可以不一样,不需要全部都一致
  • 如果控制机也测试则加 127.0.0.1:port ,然后修改 server_portserver.rmi.port (和压力机一样步骤)

 

设置 server.rmi.ssl.disable

image.png

设置 mode

image.png

  • 用于查看分布式测试过程中,每个压力机的测试结果
  • 若不启用,在运行过程中,控制器是无法实时看到压力机的结果

 

控制机运行分布式测试


启动远程服务器

image.png

这里会显示所有 remote_hosts 添加的压力机

 

点击启动后,查看压力机

image.png

分布式注意事项


  • 如果并发较高,建议将控制机设置为只启动测试脚本和收集汇总测试结果
  • 分布式测试中,如果 1S 发送 100 个模拟请求,有 5 个压力机,那么需要将脚本的线程数设置为 20,否则模拟请求数会变成 500,和预期结果相差太大
  • 只需要修改控制机的脚本,启动压力机之后,压力机执行的就是最新的脚本

 

具体栗子

针对注意事项二,我们来看看栗子

image.png

一共发出了 20 个请求(10*2)

其实这就是分布式的好处,如果需要 1000 个并发用户数,有 10 台压力机,每台压力机只需要满足 100 个并发用户数即可

 

分布式已知局限性


  • 若没有代理,RMI 不能跨子网通信,因此 JMeter 没有代理是不行的
  • 从 2.9 版本开始,JMeter发送所有剥离了响应数据的结果到控制台,这使我们降低了网络IO的影响,确保监控你的网络流量,使得网络不是争议点
  • 在 2-3 GHz 的 CPU 上,单个 JMeter 客户端根据测试的类型,可以处理 1000-2000的线程

 

分布式测试结果图表


分布式测试的前提

共有两个压力机:本机和另一台电脑的虚拟机

线程组结构树

image.png

一共有三个请求,三个监控结果图表

 

线程属性

image.png

10 个线程,持续运行 30s

 

活跃线程图表

image.png

这里可以看到有两条线,分别代表两个压力机的活跃线程数,不是按照接口来分线哦

 

TPS 图表

image.png

三条线代表三个接口的 TPS

 

是否有小伙伴有疑问,为什么这里不是按机器去分捏?

因为不同接口的 TPS 不可能相加的鸭!

 

响应时间图表

image.png

三条线的情况和 TPS 一样哦

 

分布式测试中可能会遇到的问题


缺少 rmi_keystore.jks

这就是上面有提到的证书问题

 

方式一

jmeter.properties  中设置 server.rmi.ssl.disable=true

 

方式二

bin 目录下,执行 create_create-rmi-keystore.sh


image.png

最后会在 bin 目录下生成一个证书


相关文章
|
2月前
|
XML jenkins 机器人
JMeter+Ant+Jenkins实现接口自动化测试持续集成
本文介绍了如何使用Ant生成JMeter接口测试报告,并集成到Jenkins中实现自动化测试。内容涵盖Ant与JMeter环境配置、build.xml文件设置、测试执行及报告生成,同时包括Jenkins插件安装、项目配置和钉钉消息通知的集成,帮助实现持续测试与结果可视化。
399 0
|
17天前
|
前端开发 Java jenkins
Jmeter压力测试工具全面教程和使用技巧。
JMeter是一个能够模拟高并发请求以检查应用程序各方面性能的工具,包括但不限于前端页面、后端服务及数据库系统。熟练使用JMeter不仅能够帮助发现性能瓶颈,还能在软件开发早期就预测系统在面对真实用户压力时的表现,确保软件质量和用户体验。在上述介绍的基础上,建议读者结合官方文档和社区最佳实践,持续深入学习和应用。
360 10
|
26天前
|
监控 Java 数据挖掘
利用Jmeter工具进行HTTP接口的性能测试操作
基础上述步骤反复迭代调整直至满足预期目标达成满意水平结束本轮压力评估周期进入常态监控阶段持续关注系统运转状态及时发现处理新出现问题保障服务稳定高效运作
228 0
|
3月前
|
Java 测试技术 容器
Jmeter工具使用:HTTP接口性能测试实战
希望这篇文章能够帮助你初步理解如何使用JMeter进行HTTP接口性能测试,有兴趣的话,你可以研究更多关于JMeter的内容。记住,只有理解并掌握了这些工具,你才能充分利用它们发挥其应有的价值。+
683 23
|
5月前
|
数据可视化 测试技术 API
JMeter、Apipost 与 Postman 的 API 测试对比:为什么 APIPost 是更聪明的选择
API测试如同筹备一场晚宴,选对工具至关重要。JMeter功能强大但上手难,适合专业用户;Postman简单易用,但在复杂场景和团队协作中表现有限;而Apipost则是一款智能高效的“厨房神器”。它性能测试轻松、结果清晰、学习门槛低,并且能一键集成CI/CD流程。对于追求效率与便捷的团队而言,Apipost无疑是更优选择,让API测试如同五星大厨烹饪般丝滑流畅。
|
8月前
|
缓存 网络协议
Jmeter如何对UDP协议进行测试?
`jmeter-plugins`是JMeter的插件管理器,用于管理和组织所有插件。访问[官网](https://jmeter-plugins.org/install/Install/)下载并放置于`lib/ext`目录下,重启JMeter后可在“选项”中看到插件管理器。
204 1
Jmeter如何对UDP协议进行测试?
|
10月前
|
测试技术 持续交付 Apache
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
Python性能测试新风尚:JMeter遇上Locust,性能分析不再难🧐
404 3
|
10月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
259 1
|
11月前
|
缓存 NoSQL Ubuntu
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
大数据-39 Redis 高并发分布式缓存 Ubuntu源码编译安装 云服务器 启动并测试 redis-server redis-cli
161 3
|
11月前
|
缓存 测试技术 Apache
告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
【10月更文挑战第1天】告别卡顿!Python性能测试实战教程,JMeter&Locust带你秒懂性能优化💡
265 4