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 参数化¶
在 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.OutOfMemoryError | JVM 内存不够 | 修改 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 最佳实践