如何搭建JMeter分布式集群环境来进行性能测试

在性能测试中,当面对海量用户请求的压力测试时,单机模式的JMeter往往力不从心。如何通过分布式集群环境,充分发挥JMeter的性能测试能力?这正是许多测试工程师在面临高并发、海量数据时最关注的问题。那么,如何轻松搭建JMeter分布式集群环境,实现性能测试的最大化呢?

你是否也曾为测试负载过大而不知所措?你是否对JMeter的分布式集群功能充满好奇?今天,我们将详细讲解如何通过搭建JMeter分布式集群环境,帮助你轻松应对高并发、高负载的性能测试需求!

  • 分布式测试的优势

    在分布式测试环境中,多个负载机(Slave)协同工作,可以生成更高的并发量,突破单机的资源限制。

  • 真实案例

    某大型电商平台曾通过JMeter分布式集群测试,模拟上百万用户访问场景,精准定位系统瓶颈,成功避免了购物节期间的崩溃事故。

前提条件

在开始之前,请确保满足以下前提条件:

**·**确保 JMeter 能够访问待测试的服务器(可以通过虚拟机上的 curl 命令来检查连通性),如果无法访问,你可能需要调研当前环境是否能够用来作为压力源;

**·**确保所有系统上使用相同版本的 JMeter(我们当前使用的是 5.6.3)。混用不同版本可能无法正常工作;

**·**确保系统上的防火墙已禁用或正确打开了相关端口;

概念

**控制节点:**运行 jmeter-client 的系统,它控制测试。该系统可以是你的笔记本电脑(需要先打开防火墙)或虚拟机。

**工作节点:**运行 jmeter-server 的系统,它接收来自 jmeter-client 的指令并向目标系统发送请求,通常是虚拟机。

**目标:**我们计划进行压力测试的 Web 服务器。

安装

**  对于 MacOS**

使用 Homebrew 安装 JMeter,并通过 jmeter --version 命令验证安装:

bash 复制代码
 brew install jmeter
  jmeter --version

在我编写本文时,使用的版本是 5.6.3。

对于 Ubuntu20

不要 使用 apt install jmeter 命令安装 JMeter,因为 apt 安装的版本已过时(2.13),加载 .jmx 文件将会报错从而无法正常工作。

手动安装:

1. 在 VM 上安装 JDK:

bash 复制代码
  sudo apt install openjdk-11-jre-headless`

2. 从 https://jmeter.apache.org/download_jmeter.cgi 下载压缩包文件(通过你的 笔记本电脑),然后将其上传至 VM。

3. 使用 scp/rsync 上传至虚拟机,然后解压最新的 JMeter 压缩包。在笔记本电脑上输入以下命令(请记得修改目标目录):

  rsync -avz apache-jmeter-5.6.3/ <remote-host>:/path/to/place

4. 将文件移动至正确位置并修改 PATH 环境变量:

bash 复制代码
  # 移动至合适的目录,比如 /opt/jmeter 
  sudo mv /path/to/place /opt/ 
  # 将其添加到 PATH,你可以将其写入 ~/.bashrc 文件以持久化配置 
  vim ~/.bashrc
  export PATH=/opt/jmeter/bin:$PATH 
  # 退出 vim 并使用 source 命令生效 
  source ~/.bashrc

5. 检查版本,确保一切就绪:

jmeter --version

输出结果应如下所示:

      _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____     / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \    / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |   / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <  /_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.6.3  Copyright (c) 1999-2024 The Apache Software Foundation

配置

在运行分布式模式之前,需要完成以下配置:

在控制节点

**  将服务器 IP 添加到客户端的 Properties 文件中**

在 $JMETER_HOME/bin/jmeter.properties 文件中(本文的路径是 /opt/jmeter/bin/jmeter.properties),找到名为 "remote_hosts" 的单元,添加正在运行的 JMeter 服务器的 IP 地址。可以添加多个服务器,用逗号分隔,例如:

bash 复制代码
  # Edit the line: remote_hosts=127.0.0.1 and configure as below:
  remote_hosts=10.0.0.1,10.0.0.2,10.0.0.3

通过更改值并取消注释来禁用 rmi.ssl:

server.rmi.ssl.disable=true

同时,强烈建议将默认的 jmeter.reportgenerator.overall_granularity 值从 60 秒更改为 5 秒,以获得更好的报告体验!

  jmeter.reportgenerator.overall_granularity=5000

否则,你的报告可能就会长成这样:

更改此值后,上述的报告将更易读:

在工作节点

通过更改值并取消注释来禁用 rmi.ssl:

  server.rmi.ssl.disable=true

然后启动 jmeter-server 以监听来自控制节点的命令:

  jmeter-server

你应看到如下输出:

bash 复制代码
  $ jmeter-server   
WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release Created remote object: UnicastServerRef2 [liveRef: [endpoint:[10.0.0.1:38803](local),objID:[-7d9e7ab6:1916e54ddb2:-7fff, -6565134591293374723]]]

​​​​​​​

使用方式

单节点模式

使用单节点模式进行调试,命令如下:

  jmeter -n -t <script_path> -l <results-file>

选项 -n:以非 GUI 模式运行 JMeter

选项 -t:要运行的 JMeter 测试(.jmx)文件

选项 -l:指定结果日志文件

分布式模式

注意:

所有服务器将运行相同的测试计划。JMeter 不会在服务器之间分配负载,每台服务器都会运行完整的测试计划。因此,如果你设置 1000 个线程并有 6 台 JMeter 服务器,你最终将注入 6000 个线程。

如果 jmeter.properties 文件配置正确,只需在执行命令时添加 -r 选项,例如:

  jmeter -n -t <script_path> -l <results-file> -r

选项 -r:使用 remote_hosts 属性中指定的所有节点。

你还可以使用 -R 选项指定希望使用的节点,例如:

  jmeter -n -t <script_path> -l <results-file> -R 10.0.0.1,10.0.0.2

此时只有 10.0.0.1 和 10.0.0.2 会参与测试,输出将如下所示:​​​​​​​

  $ jmeter -n -t demo.jmx -l result.csv -r  WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release  WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release  WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release  WARN StatusConsoleListener The use of package scanning to locate plugins is deprecated and will be removed in a future release  Creating summariser <summary>  Created the tree successfully using demo.jmx  Configuring remote engine: 10.0.0.1  Configuring remote engine: 10.0.0.2  Starting distributed test with remote engines: [10.0.0.1, 10.0.0.2] @ 2024 Aug 20 14:11:02 CST (1724134262441)  Warning: Nashorn engine is planned to be removed from a future JDK release  Remote engines have been started:[10.0.0.1, 10.0.0.2]  Waiting for possible Shutdown/StopTestNow/HeapDump/ThreadDump message on port 4445  summary +      1 in 00:00:00 =   17.2/s Avg:     1 Min:     1 Max:     1 Err:     0 (0.00%) Active: 2 Started: 2 Finished: 0  summary +   5999 in 00:00:10 =  605.8/s Avg:     0 Min:     0 Max:     3 Err:     0 (0.00%) Active: 0 Started: 200 Finished: 200  summary =   6000 in 00:00:10 =  602.2/s Avg:     0 Min:     0 Max:     3 Err:     0 (0.00%)  Tidying up remote @ 2024 Aug 20 14:11:12 CST (1724134272743)  ... end of run

** HTML 报告生成**

要从现有结果文件生成报告,使用以下命令:

  jmeter -g <result-file> -o <Path to output folder>

或者在负载测试完成后立即生成报告,使用以下命令:

  jmeter -n -t <script_path> -l <result-file> -r -e -o <Path to output folder>

假设你运行以下命令:

  jmeter -n -t demo.jmx -l result.csv -r -e -o report

然后你将看到如下输出:​​​​​​​

bash 复制代码
  $ ll ./report/
  total 32
  drwxr-xr-x  4 dohong users 4096 Aug 20 14:44 ./
  drwx------ 10 dohong users 4096 Aug 20 14:44 ../
  drwxr-xr-x  5 dohong users 4096 Aug 20 14:44 content/
  -rw-r--r--  1 dohong users 9669 Aug 20 14:44 index.html
  drwxr-xr-x  5 dohong users 4096 Aug 20 14:44 sbadmin2-1.0.7/
  -rw-r--r--  1 dohong users  890 Aug 20 14:44 statistics.json

双击打开 index.html 文件你就会得到类似如下的报告:

左侧导航栏可以切换不同的页面查看不同的统计数据和图表,至此,分布式压测的环境搭建就全部大功告成了。

注意事项

**·**将 jmeter.reportgenerator.overall_granularity 的值从 60000 改为 5000 强烈建议,这可以带来更好的报告体验。

**·**无需手动同步测试脚本到工作节点,JMeter 会为你完成同步,但仍需要将本地脚本同步到控制节点;

**·**使用 CLI 模式 而非 GUI 模式,避免性能下降;

**·**使用尽可能少的监听器;如果使用 -l 标志记录结果,监听器可以删除或禁用。

**·**在负载测试过程中不要使用 "查看结果树" 或 "查看表格中的结果" 监听器,它们应仅在脚本调试阶段使用,否则性能可能会下降 3 倍!

**·**如果测试需要大量数据,尤其是随机化或加密/解密数据,请将测试数据提前生成并通过 CSV 数据集读取文件,这可以避免运行时浪费资源。

在当前的技术趋势中,微服务架构云原生的普及,使得系统规模更庞大、模块更多,性能测试的重要性更加突出。JMeter分布式测试成为企业应对复杂性能测试需求的首选方案。

搭建JMeter分布式集群不仅提升了性能测试的能力,也为系统性能优化提供了更加全面的数据支撑。掌握这项技能,让你的性能测试如虎添翼

"高并发不是系统的敌人,而是推动性能优化的良师益友------关键在于你是否具备掌控它的能力!"

相关推荐
小林想被监督学习4 小时前
RabbitMQ 在实际应用时要注意的问题
分布式·rabbitmq
S-X-S4 小时前
项目集成RabbitMQ
分布式·rabbitmq
DA02214 小时前
Win10系统部署RabbitMQ Server
分布式·rabbitmq
想做富婆10 小时前
大数据,Hadoop,HDFS的简单介绍
大数据·hadoop·分布式
天堂的恶魔94610 小时前
软件测试 —— 性能测试(jmeter)
jmeter
Monee..10 小时前
【jmeter】下载及使用教程【mac】
jmeter
霍格沃兹测试开发学社测试人社区10 小时前
软件测试丨消息管道(Kafka)测试体系
软件测试·分布式·测试开发·kafka
Allen Bright10 小时前
使用 JMeter 的 Autostop Listener 插件:自动化性能测试的守护者
运维·jmeter·自动化
weisian15112 小时前
消息队列篇--原理篇--RocketMQ和Kafka对比分析
分布式·kafka·rocketmq