性能压测实践
压测验证系统性能瓶颈,是容量规划和性能优化的基础。
1. 压测工具对比
| 工具 |
特点 |
适用场景 |
| JMeter |
图形界面、功能全面 |
Web、API、DB |
| wrk/wrk2 |
轻量、Linux 原生 |
简单 HTTP 压测 |
| ab (ApacheBench) |
简单易用 |
快速单接口 |
| k6 |
JS 脚本、云报告 |
现代云原生 |
| Locust |
Python 脚本、分布式 |
复杂场景模拟 |
| Gatling |
Scala 脚本 |
高并发 API |
2. JMeter 基础使用
线程组配置:
├── 线程数:1000 # 并发用户数
├── Ramp-Up:100 # 启动时间(秒)
├── 循环次数:10 # 每个用户执行次数
└── 持续时间:300秒 # 指定压测时长
HTTP请求:
├── 协议:https
├── 服务器:api.example.com
├── 方法:POST
├── 路径:/order/create
└── Body: {"userId": 123, "amount": 100}
聚合报告指标:
├── Requests/sec (TPS)
├── Average Response Time
├── 90%/95%/99% Response Time
└── Error %
3. wrk 快速压测
# 简单压测
wrk -t12 -c400 -d30s http://api.example.com/users
# 使用 Lua 脚本(自定义请求)
wrk -t4 -c100 -d30s -s post.lua http://api.example.com/order
# post.lua 示例
wrk.method = "POST"
wrk.body = '{"userId":123,"amount":100}'
wrk.headers["Content-Type"] = "application/json"
4. Locust 分布式压测
# locustfile.py
from locust import HttpUser, task, between
class OrderUser(HttpUser):
wait_time = between(1, 3)
@task(3) # 权重3,概率更高
def create_order(self):
self.client.post("/order/create", json={
"userId": random.randint(1, 10000),
"amount": 100
})
@task(1)
def query_order(self):
order_id = random.randint(1, 100000)
self.client.get(f"/order/{order_id}")
# 本地运行
locust -f locustfile.py --host=http://api.example.com
# 分布式运行(1主 + 3从)
locust -f locustfile.py --master --expect-workers 3
5. 常见性能指标
| 指标 |
说明 |
参考值 |
| QPS/TPS |
每秒请求数 |
根据系统预期 |
| RT |
平均响应时间 |
< 200ms |
| P99 RT |
99%请求响应时间 |
< 500ms |
| Error Rate |
错误率 |
< 0.1% |
| CPU 使用率 |
压测时 CPU 占用 |
< 80% |
| 内存使用 |
JVM 堆使用 |
< 80% |
| 连接数 |
DB/Redis 连接池 |
< 80% 容量 |
6. 压测流程
1. 单接口基准测试 → 确定单接口性能上限
2. 混合场景压测 → 模拟真实用户行为
3. 峰值压测 → 春节/双十一预期流量
4. 稳定性测试 → 长时间运行是否内存泄漏
5. 瓶颈定位 → Profiler 找热点
6. 优化 & 复测 → 验证优化效果
7. 分层压测指标
| 层次 |
关注点 |
目标 |
| 网关层 |
QPS、上游超时 |
< 50ms RT |
| 服务层 |
业务逻辑耗时 |
< 100ms RT |
| 缓存层 |
命中率、并发读 |
> 95% 命中 |
| 数据层 |
SQL耗时、连接数 |
< 20ms 单查询 |
8. 注意事项
- 压测环境隔离:生产压测必须得到授权,使用影子表/影子库
- 预热 JVM:压测前先预热,避免冷启动影响结果
- 避免资源竞争:压测机与被测服务分开部署
- 记录基线:每次压测记录结果,对比优化效果
- 监控全链路:压测时同步观察监控,不只是看压测报告
最后更新:2026/05/13