--
:
--
:
--
JMeter分布式测试详解
最后更新于:
JMeter分布式测试详解
一、分布式测试概述
1.1 什么是分布式测试
分布式测试是指使用多台机器同时执行性能测试,以模拟更高的并发用户数。
1.2 分布式测试的作用
- 模拟高并发:使用多台机器模拟数万级并发用户
- 突破单机限制:避免单台机器的CPU、内存、网络瓶颈
- 提高测试效率:并行执行测试,缩短测试时间
- 真实模拟场景:模拟来自不同地理位置的用户
1.3 分布式测试架构
1分布式测试架构:
2┌─────────────────────────────────────────────────────────────┐
3│ 主控机(Master) │
4│ ┌─────────────────────────────────────────────────────┐ │
5│ │ JMeter GUI / CLI │ │
6│ │ - 发送测试计划到所有从机 │ │
7│ │ - 收集所有从机的测试结果 │ │
8│ │ - 生成汇总报告 │ │
9│ └─────────────────────────────────────────────────────┘ │
10│ │ │
11│ ┌────────────┼────────────┐ │
12│ ▼ ▼ ▼ │
13┌─────────────────────────────────────────────────────────────┐
14│ 从机(Slave) │
15│ ┌─────────────┐ ┌─────────────┐ ┌─────────────┐ │
16│ │ Slave 1 │ │ Slave 2 │ │ Slave N │ │
17│ │ - 执行测试计划 │ │ - 执行测试计划 │ │ - 执行测试计划 │ │
18│ │ - 发送结果到主控机│ │ - 发送结果到主控机│ │ - 发送结果到主控机│ │
19│ └─────────────┘ └─────────────┘ └─────────────┘ │
20└─────────────────────────────────────────────────────────────┘1.4 分布式测试适用场景
| 场景 | 说明 |
|---|---|
| 高并发测试 | 需要模拟数万级并发用户 |
| 大负载测试 | 需要长时间高负载测试 |
| 多地域测试 | 需要模拟来自不同地域的用户 |
| 单机资源不足 | 单台机器无法满足测试需求 |
二、分布式测试环境准备
2.1 硬件要求
主控机(Master)
| 资源 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核 |
| 内存 | 8GB | 16GB |
| 硬盘 | 50GB | 100GB |
| 网络 | 千兆网卡 | 万兆网卡 |
从机(Slave)
| 资源 | 最低配置 | 推荐配置 |
|---|---|---|
| CPU | 4核 | 8核 |
| 内存 | 8GB | 16GB |
| 硬盘 | 50GB | 100GB |
| 网络 | 千兆网卡 | 万兆网卡 |
2.2 软件要求
| 软件 | 版本 |
|---|---|
| JDK | 1.8+ |
| JMeter | 5.x+(所有机器版本一致) |
| 操作系统 | Linux/Unix(推荐)或 Windows |
2.3 网络要求
11. 主控机可以访问所有从机的1099端口(RMI端口)
22. 所有从机可以访问被测服务器
33. 网络延迟尽可能低(推荐局域网内测试)
44. 网络带宽足够(根据测试数据量计算)三、分布式测试配置
3.1 配置从机(Slave)
步骤1:修改jmeter.properties
1# 编辑jmeter.properties文件
2vi jmeter/bin/jmeter.properties
3
4# 修改RMI端口(可选)
5server_port=1099
6
7# 修改服务器名称(可选)
8server.rmi.localport=50000
9
10# 修改JVM参数(可选)
11vi jmeter/bin/jmeter-server
12
13# 添加JVM参数
14HEAP="-Xms2g -Xmx4g"步骤2:启动从机
1# Linux/Unix
2./jmeter-server
3
4# Windows
5jmeter-server.bat启动成功提示:
1Created remote object: UnicastServerRef2 [liveRef: [endpoint:[192.168.1.101:1099](local),objID:[12345678-1234-1234-1234-123456789012]]]3.2 配置主控机(Master)
步骤1:修改jmeter.properties
1# 编辑jmeter.properties文件
2vi jmeter/bin/jmeter.properties
3
4# 配置从机列表
5remote_hosts=192.168.1.101,192.168.1.102,192.168.1.103
6
7# 修改RMI端口(与从机一致)
8server_port=1099
9
10# 修改服务器名称(可选)
11server.rmi.localport=50000步骤2:验证从机连接
1# 检查从机是否可达
2ping 192.168.1.101
3telnet 192.168.1.101 1099
4
5# 在JMeter GUI中验证
61. 打开JMeter
72. 点击 Run → Remote Start → 选择从机
83. 确认从机连接成功四、分布式测试执行
4.1 GUI模式执行
11. 打开JMeter GUI
22. 加载测试计划
33. 点击 Run → Remote Start All(启动所有从机)
44. 等待测试完成
55. 查看结果4.2 命令行模式执行
1# 启动所有从机执行测试
2jmeter -n -t test_plan.jmx -r -l results.jtl -e -o report
3
4# 参数说明
5# -n: 非GUI模式
6# -t: 指定测试计划文件
7# -r: 启动所有远程从机
8# -R: 指定从机列表(覆盖remote_hosts配置)
9# -l: 指定结果文件
10# -e: 生成HTML报告
11# -o: 指定报告输出目录指定从机列表
1# 指定特定从机执行测试
2jmeter -n -t test_plan.jmx -R 192.168.1.101,192.168.1.102 -l results.jtl4.3 分布式测试注意事项
测试计划同步
11. 测试计划中使用的文件(如CSV文件)需要在所有从机上存在
22. 文件路径需要使用相对路径或在所有从机上相同的绝对路径
33. 配置元件中的变量需要在所有从机上可用数据文件分发
1# 使用scp分发文件到所有从机
2scp users.csv user@192.168.1.101:/path/to/jmeter/bin/
3scp users.csv user@192.168.1.102:/path/to/jmeter/bin/
4scp users.csv user@192.168.1.103:/path/to/jmeter/bin/结果收集
11. 所有从机的测试结果会自动发送到主控机
22. 主控机汇总所有结果生成报告
33. 结果文件保存在主控机上五、分布式测试优化
5.1 JVM参数优化
修改jmeter-server文件
1# Linux/Unix
2vi jmeter/bin/jmeter-server
3
4# 添加JVM参数
5HEAP="-Xms4g -Xmx8g -XX:MaxMetaspaceSize=256m"
6NEW="-Xmn512m"
7SURVIVOR="-XX:SurvivorRatio=8"
8TENURING="-XX:MaxTenuringThreshold=15"
9EVACUATION="-XX:+UseParNewGC"
10PARALLELGC="-XX:+UseParallelGC"
11GCLOG="-Xloggc:gc.log"修改jmeter.bat文件(Windows)
1rem 修改JMETER_HEAP变量
2set JMETER_HEAP=-Xms4g -Xmx8g5.2 网络优化
11. 使用局域网进行测试,避免网络延迟
22. 关闭防火墙或开放必要端口
33. 使用高速网络连接(万兆网卡)
44. 避免网络带宽瓶颈5.3 测试计划优化
11. 减少不必要的监听器(使用后端监听器)
22. 使用CSV格式保存结果(比XML格式更高效)
33. 减少断言数量(只保留必要的断言)
44. 使用配置元件复用配置5.4 负载均衡
11. 根据从机性能分配负载
22. 使用吞吐量定时器控制请求速率
33. 避免某台从机负载过高六、Docker分布式测试
6.1 创建Docker镜像
1# Dockerfile
2FROM openjdk:8-jre-alpine
3
4# 安装JMeter
5ENV JMETER_VERSION=5.6.3
6ENV JMETER_HOME=/opt/apache-jmeter-${JMETER_VERSION}
7ENV PATH=${JMETER_HOME}/bin:${PATH}
8
9RUN apk add --no-cache curl \
10 && curl -L https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz | tar -xz -C /opt \
11 && rm -rf ${JMETER_HOME}/docs ${JMETER_HOME}/printable_docs
12
13# 复制测试计划和数据文件
14COPY test_plan.jmx ${JMETER_HOME}/bin/
15COPY users.csv ${JMETER_HOME}/bin/
16
17# 暴露端口
18EXPOSE 1099 50000
19
20# 启动命令
21CMD ["jmeter-server"]6.2 构建Docker镜像
1docker build -t jmeter-slave .6.3 运行Docker容器
1# 运行多个从机容器
2docker run -d --name jmeter-slave1 --network host jmeter-slave
3docker run -d --name jmeter-slave2 --network host jmeter-slave
4docker run -d --name jmeter-slave3 --network host jmeter-slave6.4 配置主控机
1# 修改jmeter.properties
2remote_hosts=172.17.0.2,172.17.0.3,172.17.0.4
3
4# 启动测试
5jmeter -n -t test_plan.jmx -r -l results.jtl七、Kubernetes分布式测试
7.1 创建Deployment
1# jmeter-slave-deployment.yaml
2apiVersion: apps/v1
3kind: Deployment
4metadata:
5 name: jmeter-slave
6spec:
7 replicas: 10
8 selector:
9 matchLabels:
10 app: jmeter-slave
11 template:
12 metadata:
13 labels:
14 app: jmeter-slave
15 spec:
16 containers:
17 - name: jmeter-slave
18 image: jmeter-slave:latest
19 ports:
20 - containerPort: 1099
21 - containerPort: 50000
22 resources:
23 requests:
24 cpu: "1"
25 memory: "2Gi"
26 limits:
27 cpu: "2"
28 memory: "4Gi"7.2 创建Service
1# jmeter-slave-service.yaml
2apiVersion: v1
3kind: Service
4metadata:
5 name: jmeter-slave-service
6spec:
7 selector:
8 app: jmeter-slave
9 ports:
10 - port: 1099
11 targetPort: 1099
12 type: ClusterIP7.3 部署到Kubernetes
1# 部署从机
2kubectl apply -f jmeter-slave-deployment.yaml
3kubectl apply -f jmeter-slave-service.yaml
4
5# 查看从机状态
6kubectl get pods -l app=jmeter-slave
7
8# 获取从机IP列表
9kubectl get pods -l app=jmeter-slave -o jsonpath='{range .items[*]}{.status.podIP}{","}{end}'7.4 配置主控机
1# 修改jmeter.properties,配置从机IP列表
2remote_hosts=10.0.0.2,10.0.0.3,10.0.0.4,10.0.0.5,10.0.0.6,10.0.0.7,10.0.0.8,10.0.0.9,10.0.0.10,10.0.0.11
3
4# 启动测试
5jmeter -n -t test_plan.jmx -r -l results.jtl八、分布式测试监控
8.1 使用后端监听器
11. 添加后端监听器
22. 配置InfluxDB或Elasticsearch
33. 使用Grafana创建监控仪表盘
44. 实时监控测试进度和性能指标8.2 监控指标
| 指标 | 说明 |
|---|---|
| 吞吐量 | 每秒处理的请求数 |
| 响应时间 | 请求的平均响应时间 |
| 错误率 | 请求失败的比例 |
| CPU使用率 | 从机CPU使用率 |
| 内存使用率 | 从机内存使用率 |
| 网络带宽 | 从机网络带宽使用情况 |
8.3 监控工具
| 工具 | 说明 |
|---|---|
| InfluxDB + Grafana | 实时监控和可视化 |
| Prometheus + Grafana | 指标收集和监控 |
| ELK Stack | 日志分析和监控 |
| Nagios/Zabbix | 基础设施监控 |
九、实战案例
9.1 案例1:电商网站高并发测试
需求:模拟10000个用户同时访问电商网站
配置步骤:
- 准备环境:
1主控机: 1台(8核16GB)
2从机: 10台(4核8GB)- 配置从机:
1# 修改jmeter.properties
2server_port=1099
3server.rmi.localport=50000
4
5# 启动从机
6./jmeter-server- 配置主控机:
1# 修改jmeter.properties
2remote_hosts=192.168.1.101,192.168.1.102,...,192.168.1.110
3
4# 分发测试数据
5for i in {101..110}; do
6 scp users.csv user@192.168.1.$i:/opt/jmeter/bin/
7done- 创建测试计划:
1线程组(1000线程,循环10次)
2├── HTTP请求默认值
3├── HTTP信息头管理器
4├── HTTP Cookie管理器
5├── 高斯随机定时器(1000毫秒,偏差500)
6├── HTTP请求(首页)
7├── HTTP请求(商品列表)
8├── HTTP请求(商品详情)
9├── HTTP请求(添加购物车)
10└── HTTP请求(下单)- 执行测试:
1jmeter -n -t e-commerce.jmx -r -l results.jtl -e -o report- 分析结果:
1- 吞吐量:2000请求/秒
2- 平均响应时间:500毫秒
3- 错误率:0.5%
4- P99响应时间:2000毫秒9.2 案例2:API接口压力测试
需求:测试API接口在10000并发下的性能
配置步骤:
- 准备环境:
1主控机: 1台(8核16GB)
2从机: 5台(8核16GB)- 配置从机:
1# 修改JVM参数
2HEAP="-Xms8g -Xmx16g"
3
4# 启动从机
5./jmeter-server- 配置主控机:
1remote_hosts=192.168.1.101,192.168.1.102,192.168.1.103,192.168.1.104,192.168.1.105- 创建测试计划:
1线程组(2000线程,循环Forever)
2├── HTTP请求默认值
3├── HTTP信息头管理器
4├── 吞吐量定时器(60000样本/分钟 = 1000样本/秒)
5├── HTTP请求(API接口)
6├── JSON断言
7└── 响应时间断言(5000毫秒)- 执行测试:
1jmeter -n -t api-test.jmx -r -l results.jtl -e -o report -Jduration=300- 分析结果:
1- 吞吐量:1000请求/秒
2- 平均响应时间:300毫秒
3- 错误率:0.1%
4- CPU使用率:80%
5- 内存使用率:70%9.3 案例3:Docker分布式测试
需求:使用Docker容器进行分布式测试
配置步骤:
- 创建Dockerfile:
1FROM openjdk:8-jre-alpine
2
3ENV JMETER_VERSION=5.6.3
4ENV JMETER_HOME=/opt/apache-jmeter-${JMETER_VERSION}
5ENV PATH=${JMETER_HOME}/bin:${PATH}
6
7RUN apk add --no-cache curl \
8 && curl -L https://archive.apache.org/dist/jmeter/binaries/apache-jmeter-${JMETER_VERSION}.tgz | tar -xz -C /opt \
9 && rm -rf ${JMETER_HOME}/docs ${JMETER_HOME}/printable_docs
10
11COPY test_plan.jmx ${JMETER_HOME}/bin/
12COPY data.csv ${JMETER_HOME}/bin/
13
14EXPOSE 1099 50000
15
16CMD ["jmeter-server"]- 构建Docker镜像:
1docker build -t jmeter-slave .- 运行Docker容器:
1docker run -d --name jmeter-slave1 --network host jmeter-slave
2docker run -d --name jmeter-slave2 --network host jmeter-slave
3docker run -d --name jmeter-slave3 --network host jmeter-slave
4docker run -d --name jmeter-slave4 --network host jmeter-slave
5docker run -d --name jmeter-slave5 --network host jmeter-slave- 配置主控机:
1# 获取容器IP
2docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' jmeter-slave1
3
4# 修改jmeter.properties
5remote_hosts=172.17.0.2,172.17.0.3,172.17.0.4,172.17.0.5,172.17.0.6- 执行测试:
1jmeter -n -t test_plan.jmx -r -l results.jtl -e -o report十、常见问题
10.1 从机连接失败
回答:
- 检查从机是否启动
- 检查网络连接是否正常
- 检查防火墙是否开放1099端口
- 检查JMeter版本是否一致
10.2 测试结果不一致
回答:
- 确保所有从机的测试计划一致
- 确保所有从机的数据文件一致
- 检查时间同步(使用NTP)
- 检查从机资源是否足够
10.3 从机负载过高
回答:
- 增加从机数量
- 优化测试计划
- 调整JVM参数
- 使用吞吐量定时器控制速率
10.4 网络延迟影响测试结果
回答:
- 使用局域网进行测试
- 减少测试数据量
- 优化网络配置
- 使用高速网络连接
下一章:15-实战案例.md
📡
👤
作者:
阿海
🌐
版权:
本站文章除特别声明外,均采用
CC BY-NC-SA 4.0
协议,转载请注明来自
阿海 Blog!
- 01JMeter界面详解 2026-07-11
- 02性能测试学习路线 2026-07-11
- 03JMeter线程组配置详解 2026-07-11