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

在本文中,我将介绍如何通过使用虚拟机来搭建一个 JMeter 分布式集群来进行性能测试,并使用命令行工具生成报告。阅读完本文后,你将了解:

  • JMeter 分布式模式的架构;
  • 如何设置集群环境并进行配置;
  • 如何在非 GUI 模式下运行测试并生成报告;

前提条件

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

  • 确保 JMeter 能够访问待测试的服务器(可以通过虚拟机上的 curl 命令来检查连通性),如果无法访问,你可能需要调研当前环境是否能够用来作为压力源;
  • 确保所有系统上使用相同版本的 JMeter(我们当前使用的是 5.6.3)。混用不同版本可能无法正常工作;
  • 确保系统上的防火墙已禁用或正确打开了相关端口;

概念

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

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

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

image.png

安装

对于 MacOS

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

brew install jmeter
jmeter --version

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

对于 Ubuntu20

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

手动安装:

  1. VM 上安装 JDK:
sudo apt install openjdk-11-jre-headless
  1. https://jmeter.apache.org/download_jmeter.cgi 下载压缩包文件(通过你的 笔记本电脑),然后将其上传至 VM(如果你的 VM 机器可以正常联网则可以略过这里的下载到本地再上传的操作,直接下载并解压然后跳到第 4 步)。

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

rsync -avz apache-jmeter-5.6.3/ <remote-host>:/path/to/place
  1. 将文件移动至正确位置并修改 PATH 环境变量:
# 移动至合适的目录,比如 /opt/jmeter 
sudo mv /path/to/place /opt/ 
# 将其添加到 PATH,你可以将其写入 ~/.bashrc 文件以持久化配置 
vim ~/.bashrc
export PATH=/opt/jmeter/bin:$PATH 
# 退出 vim 并使用 source 命令生效 
source ~/.bashrc
  1. 检查版本,确保一切就绪:
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 地址。可以添加多个服务器,用逗号分隔,例如:

# 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

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


image.png

更改此值后,图表的精度会提升,如下:


image.png

在工作节点

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

server.rmi.ssl.disable=true

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

jmeter-server

你应看到如下输出:

$ 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.110.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

然后你将看到类似如下输出:

$ 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 文件你就会得到类似如下的报告:

image.png

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

注意事项

  • 强烈建议jmeter.reportgenerator.overall_granularity 的值从 60000 改为 5000 ,这可以带来更好的报告体验。
  • 无需手动同步测试脚本到工作节点,JMeter 会为你完成同步,但你仍需要将本地脚本同步到控制节点上;
  • 使用 CLI 模式 而非 GUI 模式,避免性能下降;
  • 使用尽可能少的监听器;如果使用 -l 标志记录结果,监听器可以删除或禁用。
  • 在实际的性能测试过程中不要使用 "查看结果树" 或 "查看表格中的结果" 监听器,它们应仅在脚本调试阶段使用,否则性能可能会下降 3 倍
  • 如果测试需要大量数据,尤其是随机化或加密/解密数据,请将测试数据提前生成并通过 CSV 数据集读取文件,这可以避免运行时浪费资源。

参考文档

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,372评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,368评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,415评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,157评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,171评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,125评论 1 297
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,028评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,887评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,310评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,533评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,690评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,411评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,004评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,659评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,812评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,693评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,577评论 2 353

推荐阅读更多精彩内容