1200 字
约 4 分钟
8
S16-X02 · JMeter 与压测入门(附录)
适用读者:第一次要给自己接口"打一枪"看能扛多少的人。
前置:S16-B01(测试层次)、S16-J01(链路追踪)。
覆盖旧文:4579(JMeter 入门教程:介绍、设置中文与基础使用,3,390 字符)、2946(性能测试入门:从概念到压测工具,2,158 字符)。
扩展点:E-S16-041(压测四指标与"别测缓存命中率")、E-S16-042(结论可信的五个前提)。
下一篇:S16 系列验收(v3)。
1. 一句话结论
压测不是"跑个脚本看 TPS",而是控制变量去回答一个具体问题:在什么负载、什么数据量、什么缓存状态下,P95 延迟是多少、瓶颈在哪。没有明确问题的压测,结果一定被误读。
出处:
A-4579、A-2946。
2. 最小可运行(JMeter 5.6 口径)
环境:JMeter 5.6.3 + JDK 17(GUI 只用于编排,压测用 CLI)
① 新建 Thread Group:Threads=50, Ramp-up=10s, Loop=100
② 加 HTTP Request:协议 http,域名 127.0.0.1,端口 8080,路径 /api/items?page=1
③ 加 HTTP Header Manager:Content-Type: application/json
④ 加监听器(调试用):View Results Tree(压测时关掉,极耗资源)
⑤ CLI 运行:
jmeter -n -t plan.jmx -l result.jtl -e -o report/
预期:report/index.html 生成,含 Throughput、P95、Error%
中文化(原文覆盖):Options → Choose Language → Chinese (Simplified);仅影响界面,不影响脚本。
判据:"GUI 编排、CLI 执行"——GUI 会吃内存与 CPU,压测结果不可信(原文同样强调)。
3. 压测四指标(E-S16-041)
| 指标 | 含义 | 判据 |
|---|---|---|
| Throughput(TPS/RPS) | 每秒完成请求数 | 与并发数一起看,单看无意义 |
| P95 / P99 延迟 | 尾部延迟 | 平均值会掩盖长尾,必须看 P95 |
| Error% | 失败率 | 超阈值(如 0.1%)时结果作废 |
| 资源水位 | CPU / 内存 / 连接数 / IO | 定位瓶颈:CPU 满 = 计算瓶颈;连接满 = 池太小 |
"别测缓存命中率":冷缓存与热缓存的 TPS 可能差 10 倍。判据:"压测必须先声明缓存状态,并分别测冷/热两条曲线"。
4. 结论可信的五个前提(E-S16-042)
① 数据量接近生产(1 万行与 1000 万行的 SQL 计划完全不同)
② 压测机与被测机分离(否则 JMeter 抢 CPU)
③ 网络位置接近真实(本机 127.0.0.1 测不出网络与 TLS 成本)
④ 关闭调试日志与监听器
⑤ 至少跑 3 轮,看方差;单轮数字不算结论
判据:"压测结论的强度 = 最弱的那条前提"——数据量不对,后面的调优全是误判。
常见误读:
| 误读 | 真相 |
|---|---|
| "TPS 到 500 就上不去了" | 可能是连接池 20 × 单请求 40 ms 的数学结果 |
| "加线程就加 TPS" | 到拐点后加线程只加延迟与错误 |
| "P95 高是代码慢" | 也可能是 GC、锁竞争、下游超时重传 |
5. 与其他工具的分工
| 工具 | 适合 |
|---|---|
| JMeter | 协议级压测、脚本化、报告完整 |
| wrk / hey | 单接口快速摸底 |
| Gatling | 代码化压测(Scala/Java DSL) |
| k6 | JS 脚本 + CI 集成 |
判据:"先 hey/wrk 摸底,再 JMeter 出报告"——摸底十秒出结果,报告用于归档与对比。
6. 反例:六种"压测白做"
| 做法 | 后果 |
|---|---|
| GUI 里开着监听器压测 | 结果被人为压低 |
| 用 1 万行数据测出结论 | 上生产即雪崩 |
| 只报平均值 | 长尾失败不可见 |
| 压测机与被测机同机 | 资源争抢,数字无意义 |
| 不声明缓存状态 | 冷热混测,无法复现 |
| 单轮即结论 | 方差当能力 |
7. 自测
- 压测四指标?为什么必须看 P95?
- 为什么"别测缓存命中率"?该怎么测?
- 结论可信的五个前提?
- "TPS 上不去"最容易被误判成什么?实际可能是什么?
答案
- 吞吐、P95/P99、错误率、资源水位;平均值掩盖长尾。
- 冷热差可达十倍;分冷/热两条曲线各自声明。
- 数据量、机器分离、网络位置、关监听器、多轮看方差。
- 误判为"代码性能上限";实际可能是池大小 × 单请求耗时的乘积上限。
8. 下一篇
S16 系列验收(v3)。
本篇属于系列《S16 · 测试与可观测性》。旧文来源:A-4579/2946;扩展点 E-S16-041/042。JMeter 版本行为以官方文档为准(待核)。
S16-X02 · JMeter 与压测入门(附录)
https://www.clxhxhhr.top/posts/5417/ 评论
0 条
还没有评论,先写一条吧。