头像
淇迹时刻
-- : -- : --
切换主题色
-- : -- : --

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)

资源最低配置推荐配置
CPU4核8核
内存8GB16GB
硬盘50GB100GB
网络千兆网卡万兆网卡

从机(Slave)

资源最低配置推荐配置
CPU4核8核
内存8GB16GB
硬盘50GB100GB
网络千兆网卡万兆网卡

2.2 软件要求

软件版本
JDK1.8+
JMeter5.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.jtl

4.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 -Xmx8g

5.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-slave

6.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: ClusterIP

7.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主控机: 1台(8核16GB)
2从机: 10台(4核8GB)
  1. 配置从机:
1# 修改jmeter.properties
2server_port=1099
3server.rmi.localport=50000
4
5# 启动从机
6./jmeter-server
  1. 配置主控机:
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. 创建测试计划:
 1线程组(1000线程,循环10次)
 2├── HTTP请求默认值
 3├── HTTP信息头管理器
 4├── HTTP Cookie管理器
 5├── 高斯随机定时器(1000毫秒,偏差500)
 6├── HTTP请求(首页)
 7├── HTTP请求(商品列表)
 8├── HTTP请求(商品详情)
 9├── HTTP请求(添加购物车)
10└── HTTP请求(下单)
  1. 执行测试:
1jmeter -n -t e-commerce.jmx -r -l results.jtl -e -o report
  1. 分析结果:
1- 吞吐量:2000请求/秒
2- 平均响应时间:500毫秒
3- 错误率:0.5%
4- P99响应时间:2000毫秒

9.2 案例2:API接口压力测试

需求:测试API接口在10000并发下的性能

配置步骤

  1. 准备环境:
1主控机: 1台(8核16GB)
2从机: 5台(8核16GB)
  1. 配置从机:
1# 修改JVM参数
2HEAP="-Xms8g -Xmx16g"
3
4# 启动从机
5./jmeter-server
  1. 配置主控机:
1remote_hosts=192.168.1.101,192.168.1.102,192.168.1.103,192.168.1.104,192.168.1.105
  1. 创建测试计划:
1线程组(2000线程,循环Forever)
2├── HTTP请求默认值
3├── HTTP信息头管理器
4├── 吞吐量定时器(60000样本/分钟 = 1000样本/秒)
5├── HTTP请求(API接口)
6├── JSON断言
7└── 响应时间断言(5000毫秒)
  1. 执行测试:
1jmeter -n -t api-test.jmx -r -l results.jtl -e -o report -Jduration=300
  1. 分析结果:
1- 吞吐量:1000请求/秒
2- 平均响应时间:300毫秒
3- 错误率:0.1%
4- CPU使用率:80%
5- 内存使用率:70%

9.3 案例3:Docker分布式测试

需求:使用Docker容器进行分布式测试

配置步骤

  1. 创建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"]
  1. 构建Docker镜像:
1docker build -t jmeter-slave .
  1. 运行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. 配置主控机:
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
  1. 执行测试:
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

最新文章