跳转至

JMeter 负载压测

一句话概述:Apache JMeter 是开源的性能测试工具,模拟大量用户同时访问你的网站/API,测量它能扛住多大压力,找出性能瓶颈。

核心知识点

概念白话解释
线程组(Thread Group)模拟的用户群,比如 100 个线程 = 100 个虚拟用户
取样器(Sampler)发送请求的组件,比如 HTTP 请求
监听器(Listener)收集和展示结果的组件,比如聚合报告
断言(Assertion)验证响应是否正确,比如状态码是 200
定时器(Timer)控制请求间隔,模拟真实用户的思考时间
吞吐量(Throughput)每秒处理的请求数(TPS/QPS)
响应时间(Response Time)从发请求到收到响应的时间

安装配置

# 方式一:下载安装
# 1. 确保已安装 Java 8+
java -version  # 检查 Java 版本

# 2. 下载 JMeter
wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.3.tgz  # 下载最新版
tar -xzf apache-jmeter-5.6.3.tgz  # 解压
cd apache-jmeter-5.6.3  # 进入目录

# 3. 启动 GUI
./bin/jmeter  # Linux/Mac 启动图形界面
# bin\jmeter.bat  # Windows 启动

# 方式二:Docker
docker run -d --name jmeter -v $(pwd)/tests:/tests justb4/jmeter  # 用 Docker 跑

基本使用

GUI 创建测试计划

测试计划的结构(树形):
Test Plan(测试计划)
├── Thread Group(线程组)- 设置虚拟用户数
│   ├── HTTP Request Defaults(默认配置)- 设置基础 URL
│   ├── HTTP Request(取样器)- 具体的请求
│   ├── Response Assertion(断言)- 验证响应
│   ├── Constant Timer(定时器)- 请求间隔
│   └── View Results Tree(监听器)- 查看结果
└── Summary Report(汇总报告)

命令行模式运行(推荐生产使用)

# 命令行模式运行测试(不开 GUI,性能更好)
./bin/jmeter -n \  # -n: 非 GUI 模式
  -t test_plan.jmx \  # -t: 测试计划文件
  -l result.jtl \  # -l: 结果输出文件
  -e \  # -e: 测试后生成 HTML 报告
  -o report/  # -o: HTML 报告目录

# 查看报告
open report/index.html  # 打开 HTML 报告

用 JMX 文件配置测试

<!-- test_plan.jmx - JMeter 测试计划(可以用 GUI 生成,也可以手写) -->
<?xml version="1.0" encoding="UTF-8"?>
<jmeterTestPlan version="1.2">
  <hashTree>
    <TestPlan testname="API性能测试">
      <elementProp name="TestPlan.user_defined_variables" elementType="Arguments"/>
    </TestPlan>
    <hashTree>
      <!-- 线程组:100个用户,10秒内启动完毕,循环10次 -->
      <ThreadGroup testname="用户模拟">
        <intProp name="ThreadGroup.num_threads">100</intProp>  <!-- 虚拟用户数 -->
        <intProp name="ThreadGroup.ramp_time">10</intProp>  <!-- 启动时间(秒) -->
        <intProp name="LoopController.loops">10</intProp>  <!-- 每个用户循环次数 -->
      </ThreadGroup>
    </hashTree>
  </hashTree>
</jmeterTestPlan>

关键参数设置

线程组参数:
- 线程数(Number of Threads):虚拟用户数量,比如 100
- 启动时间(Ramp-Up):100 个用户在 10 秒内逐步启动(每秒加 10 个)
- 循环次数(Loop Count):每个用户重复执行多少次
- 持续时间(Duration):测试运行多长时间

HTTP 请求参数:
- 服务器地址:example.com
- 端口:80/443
- 协议:http/https
- 路径:/api/users
- 方法:GET/POST/PUT/DELETE
- 请求体:JSON 数据
- Content-Type:application/json

高级用法

常用监听器

1. 聚合报告(Aggregate Report)- 最常用
   - Average(平均响应时间)
   - Median(中位数,50%请求的响应时间)
   - 90% Line(90%请求在这个时间内完成)
   - 95% Line / 99% Line
   - Error %(错误率)
   - Throughput(每秒请求数)

2. 查看结果树(View Results Tree)- 调试用
   - 看每个请求的请求头、请求体、响应

3. 响应时间图(Response Time Graph)
   - 直观看响应时间变化趋势

CSV 参数化

# users.csv - 测试数据文件
username,password
user1,pass1
user2,pass2
user3,pass3
在 JMeter 中:
1. 添加 "CSV Data Set Config" 配置元件
2. 设置文件路径:users.csv
3. 变量名:username,password
4. 在 HTTP 请求中用 ${username} 和 ${password} 引用

分布式测试

# 主控机运行
./bin/jmeter -n -t test.jmx \
  -R slave1_ip,slave2_ip \  # 指定从节点 IP
  -l result.jtl

# 从节点启动
./bin/jmeter-server  # 在每台从节点上启动服务

性能基准参考

一般 Web 应用的性能基准:
- 响应时间 < 200ms:优秀
- 响应时间 200ms-1s:正常
- 响应时间 1s-3s:需优化
- 响应时间 > 3s:有问题

- 错误率 < 0.1%:优秀
- 错误率 0.1%-1%:可接受
- 错误率 > 1%:需要修复

常见报错

报错信息原因解决方案
java.lang.OutOfMemoryErrorJVM 内存不够修改 jmeter.bat/sh 增大 -Xmx 参数
Connection refused目标服务没启动检查服务器地址和端口
Non HTTP response超时或网络问题增大超时时间,检查网络
GUI 卡死数据量太大用命令行模式运行,不要在 GUI 跑大量测试
结果不准本机资源不够JMeter 本身占用资源影响了结果
乱码编码问题在 HTTP 请求中设置 Content-Type: charset=utf-8

速查表

# CLI 命令
jmeter -n -t test.jmx -l result.jtl  # 命令行运行
jmeter -n -t test.jmx -l result.jtl -e -o report/  # 运行+生成报告
jmeter -g result.jtl -o report/  # 从结果文件生成报告
jmeter -h  # 帮助信息

# 关键指标
TPS/QPS      # 每秒事务/查询数
RT           # 响应时间
Error Rate   # 错误率
P90/P95/P99  # 百分位响应时间
Throughput   # 吞吐量(KB/s)
Concurrency  # 并发用户数

# 常用组件
Thread Group         # 线程组(用户模拟)
HTTP Request         # HTTP 请求
HTTP Header Manager  # 请求头管理
CSV Data Set Config  # 数据参数化
Response Assertion   # 响应断言
Constant Timer       # 固定延时
Aggregate Report     # 聚合报告
View Results Tree    # 结果树(调试)

参考:JMeter 官网 | JMeter 文档 | JMeter 最佳实践