JMeter分布式压测实战 – 从单机到集群的性能测试方案

---

前言

大家好,我是运维与测试,做过多年性能测试。JMeter是我最常用的压测工具,但在处理高并发场景时,单机JMeter往往扛不住压力。今天这篇文章,分享JMeter分布式压测的实战经验。 ---

一、为什么需要分布式压测?

单机瓶颈

JMeter单机运行时,瓶颈在于: 实测数据: | 并发数 | 单机JMeter表现 | |--------|----------------| | 100 | 稳定 | | 500 | CPU 70%+ | | 1000 | CPU 95%+,响应时间变长 | | 2000+ | JMeter崩溃或报错 |

分布式压测方案

分布式压测使用多台机器: 架构: ` Controller (控制节点) └── Agent1 (执行节点) └── Agent2 (执行节点) └── Agent3 (执行节点) └── ... ` ---

二、JMeter分布式部署

环境准备

Controller节点: Agent节点:

配置Agent节点

1. 编辑jmeter.properties `properties

Agent配置文件

remote_hosts=192.168.1.101:1099,192.168.1.102:1099,192.168.1.103:1099 server_port=1099 server.rmi.localport=1099 ` 2. 启动Agent服务 `bash

Linux/Mac

./jmeter-server

Windows

jmeter-server.bat `

配置Controller节点

`properties

Controller的jmeter.properties

remote_hosts=192.168.1.101,192.168.1.102,192.168.1.103 server.rmi.ssl.disable=true # 关闭SSL(内网测试) `

启动分布式测试

方式1:GUI模式 在JMeter GUI中: 方式2:命令行模式 `bash

启动所有Agent

jmeter -n -t test.jmx -r

启动指定Agent

jmeter -n -t test.jmx -R 192.168.1.101,192.168.1.102 ` ---

三、分布式压测实战

测试脚本设计

关键点:分布式脚本要考虑线程分配 `xml 100 10 true 300 ` 注意:

测试数据分离

分布式测试的数据问题: 解决方案:CSV数据文件分割 `

Agent1: data_1.csv

Agent2: data_2.csv

Agent3: data_3.csv

` 在脚本中使用变量: ` ${__P(data.file,data_${agent_id}.csv)} `

测试报告合并

JMeter 5.0+支持分布式报告自动合并: `bash

生成HTML报告

jmeter -n -t test.jmx -r -l result.jtl -e -o report_folder ` ---

四、性能优化技巧

JMeter优化配置

`properties

jmeter.properties优化

增加内存

HEAP=-Xms4g -Xmx4g

使用G1垃圾回收

GC_ALGO=-XX:+UseG1GC -XX:MaxGCPauseMillis=100

关用GUI优化

jmeter.save.saveservice.output_format=csv jmeter.save.saveservice.data_type=true jmeter.save.saveservice.label=true jmeter.save.saveservice.response_code=true jmeter.save.saveservice.response_data=false # 不保存响应体 jmeter.save.saveservice.response_message=true jmeter.save.saveservice.successful=true jmeter.save.saveservice.thread_name=true jmeter.save.saveservice.time=true jmeter.save.saveservice.subresults=false jmeter.save.saveservice.assertions=true jmeter.save.saveservice.latency=true jmeter.save.saveservice.connect_time=true jmeter.save.saveservice.samplerData=false jmeter.save.saveservice.responseHeaders=false jmeter.save.saveservice.requestHeaders=false jmeter.save.saveservice.encoding=false jmeter.save.saveservice.bytes=true jmeter.save.saveservice.sent_bytes=true jmeter.save.saveservice.url=true `

禁用监听器

测试执行时禁用所有监听器: 使用后端监听器替代: `xml org.apache.jmeter.visualizers.backend.influxdb.InfluxdbBackendListenerClient org.apache.jmeter.visualizers.backend.influxdb.HttpMetricsSender http://influxdb:8086/write?db=jmeter `

使用非GUI模式

`bash

性能对比

GUI模式:CPU占用高,响应慢 非GUI模式:CPU占用低,响应快

推荐命令

jmeter -n -t test.jmx -l result.jtl -Jthreads=100 -Jrampup=10 -Jduration=300 ` ---

五、监控与报告

InfluxDB + Grafana监控

1. 安装InfluxDB `bash docker run -d -p 8086:8086 influxdb:2.0 ` 2. 创建数据库 `sql CREATE DATABASE jmeter ` 3. JMeter配置Backend Listener `xml http://localhost:8086/write?db=jmeter jmeter_results ` 4. Grafana配置 导入JMeter Dashboard模板(ID: 5495)

关键监控指标

| 指标 | 说明 | 告警阈值 | |------|------|----------| | 平均响应时间 | 请求平均耗时 | > 500ms | | 最大响应时间 | 最慢请求耗时 | > 3000ms | | TPS | 每秒事务数 | 1% | | CPU使用率 | Agent节点CPU | > 80% | | 内存使用率 | Agent节点内存 | > 85% | ---

六、常见问题解决

问题1:Agent连接失败

错误: ` Connection refused to host: 192.168.1.101 ` 解决: `bash

检查防火墙

firewall-cmd --add-port=1099/tcp --permanent firewall-cmd --add-port=50000/tcp --permanent firewall-cmd --reload

或临时关闭防火墙

systemctl stop firewalld `

问题2:Agent启动报错

错误: ` Error creating rmi server ` 解决: `bash

编辑启动脚本

jmeter-server.sh

SERVER_RMI_HOST=-Djava.rmi.server.hostname=192.168.1.101

或在jmeter.properties中设置

server.rmi.host=192.168.1.101 `

问题3:报告数据不准

原因:Agent时钟不同步 解决: `bash

同步所有节点时间

ntpdate time.windows.com

或使用chrony

systemctl start chronyd ` ---

七、实战案例:电商系统压测

测试场景

电商大促场景:

压测配置

`yaml 目标并发: 10000 TPS Agent节点: 10台 每台线程: 1000 压测时长: 1小时 预热时间: 5分钟 `

测试脚本结构

` ThreadGroup (1000线程) ├── If Controller (10%) -> 登录场景 ├── If Controller (60%) -> 商品浏览场景 └── If Controller (30%) -> 下单支付场景 `

压测结果分析

| 指标 | 结果 | 结论 | |------|------|------| | TPS | 8500 | 未达标,需优化 | | 平均响应时间 | 350ms | 正常 | | 错误率 | 0.5% | 正常 | | 系统CPU | 75% | 有余量 | | 数据库CPU | 95% | 瓶颈点 | 优化建议: ---

八、RunnerGo对比

RunnerGo内置性能测试功能,相比JMeter: | 对比项 | JMeter | RunnerGo | |--------|--------|----------| | 分布式支持 | 需手动配置 | 内置支持 | | 监控集成 | 需额外配置 | 内置监控 | | 报告可视化 | Grafana集成 | 内置报告 | | 学习难度 | 较高 | 较低 | | 可视化编排 | XML脚本 | 可视化 | 如果团队不熟悉JMeter,RunnerGo是更好的选择。 ---

总结

JMeter分布式压测要点: | 环节 | 关键配置 | |------|----------| | Agent部署 | jmeter-server启动 | | Controller配置 | remote_hosts配置 | | 脚本设计 | 线程数按Agent分配 | | 数据分离 | CSV文件分割 | | 监控集成 | InfluxDB+Grafana | | 性能优化 | 非GUI、禁用监听器 | --- 下期预告:RestAssured框架精讲 - Java接口自动化测试从0到1
分享到:

探索 RunnerGo 全栈测试平台

RunnerGo 是一款面向企业的全栈测试平台,集接口测试、自动化测试、性能测试、UI测试于一体,助力企业提升研发效能。

接口测试
性能测试
自动化测试
UI测试
免费体验 RunnerGo