文档目录
测试分层
本章定位:回答「在哪一层测」。同一个性能问题,选错层级要么浪费几天,要么得出错误结论。
前置知识:第 0 章(协调遗漏、排队)、第 1 章(SLO、容量曲线) 预计总时长:约 3.5 小时(阅读 2 小时 + Lab 3 约 1.5 小时) 配套代码:docs/code/03-test-pyramid/
一、本章要回答的六个问题
- 为什么「一上来就压全链路」通常是错的?(第 1 节)
- 有什么测试只要几十秒、却能发现 80% 的性能问题?(第 2 节)
- 什么时候值得做全链路压测,什么时候不值得?(第 3 节)
- 阶梯加压、恒定压测、尖峰测试分别用来发现什么?(第 4 节)
- 为什么「跑了 10 分钟没问题」不能说明没问题?(第 5 节)
- 系统垮掉的时候,你该记录哪些信息?(第 6 节)
二、为什么「在哪测」比「怎么测」更先决定成败
一个真实的场景:
同事说:「订单接口慢了,你压一下看看。」
如果你直接上全链路压测,会得到这样的结果:
压测了 40 分钟,结论:QPS 800 时 P99 是 420 ms,超标。
原因:不知道。
40 分钟换来一个「不知道」。 而如果用正确的层级,可能 5 分钟就有答案:
组件基准(30 秒):发现 select * from orders where user_id = ? 这条 SQL 的 P99 是 380 ms
→ 结论:缺索引。
核心区别:组件基准隔离了网络、网关、排队,把「慢」直接暴露成「这条 SQL 慢」。全链路压测里,这 380 ms 会被淹没在总延迟里,你只能看到「整体慢」。
本章的核心法则:要回答「为什么慢」,越往下层越好;要回答「能扛多少」,必须往上走。
三、小节地图
| 节 | 标题 | 一句话内容 | 时长 | 要动手 |
|---|---|---|---|---|
| 1 | 六层金字塔总览 | 诊断往下走,容量往上走 | 20 min | — |
| 2 | 组件基准:性价比最高的一层 | 用真实依赖、几十秒迭代、直接定位到 SQL | 30 min | ✅ 实验 |
| 3 | 集成基准与全链路:什么时候值得 | 只有测 SLO、容量、级联问题才需要全链路 | 25 min | ✅ 实验 |
| 4 | 负载曲线:阶梯、恒定、尖峰 | 三种曲线用来发现三种不同的问题 | 30 min | ✅ 实验 |
| 5 | 浸泡测试:唯一能发现泄漏的测试 | 短跑发现不了的问题,长跑才能发现 | 25 min | ✅ 实验 |
| 6 | 破坏性测试:崩溃点与崩溃形态 | 不只看「什么时候垮」,更看「怎么垮」 | 25 min | ✅ 实验 |
| 7 | 层级选择与成本 | 能用便宜层级回答的,绝不用贵的 | 20 min | — |
| 8 | Lab 3:同一个接口的两层测试 | 亲手验证「不同层级发现不同问题」 | 90 min | ✅ 实验 |
四、本章的产出物
- 对一个接口的两层测试:组件基准 + 全链路压测,并说明各自发现了什么只有它能发现的问题。
- 一条负载曲线:至少包含阶梯加压与恒定压测两种模式。
- 一次浸泡测试:至少 30 分钟,输出资源趋势(内存、连接数、线程数是否单调上升)。
- 一次破坏性测试记录:崩溃点、崩溃形态(超时级联?连接池耗尽?OOM?)、恢复时间。
- 一张层级选择决策表:针对你自己的服务,写清「什么问题在哪个层级查」。
五、学完本章的验收标准
- 面对一个性能问题,能先判断该在哪个层级测,并说出理由。
- 能写出一个组件基准(真实数据库 + 采样循环 + 报告 P50/P99)。
- 能说出全链路压测的三个「值得做」的理由和三个「不值得做」的理由。
- 能设计阶梯、恒定、尖峰三种负载曲线,并说清各自要发现什么。
- 知道浸泡测试至少该跑多久,以及该盯哪些指标。
- 破坏性测试能记录崩溃形态,而不只是崩溃点。
六、一个提醒
本章开始你会真的搭环境(Testcontainers、k6、Docker)。这意味着:
- 你的结论开始变得可迁移(不再是「开发机上的数字」)。
- 但环境影响也变多了:容器 CPU 配额、数据量、数据分布、网络位置。
所以第 1 章的两张表(SLO 表、实验元数据)从本章开始真正派上用场。 每做一次测试,都要先把它们填上。
本节目录
- 六层金字塔总览 3.1 六层金字塔总览 上一节:无 | 下一节:3.2 组件基准 一句话结论 性能测试分六层,每层回答不同的问题。 记住一条法则:要回答「为什么慢」,越往下 …
- 组件基准 3.2 组件基准:性价比最高的一层 上一节:3.1 六层金字塔总览 | 下一节:3.3 集成基准与全链路 配套代码 …
- 集成基准与全链路 3.3 集成基准与全链路:什么时候值得 上一节:3.2 组件基准 | 下一节:3.4 负载曲线 配套代码 …
- 负载曲线 3.4 负载曲线:阶梯、恒定、尖峰 上一节:3.3 集成基准与全链路 | 下一节:3.5 浸泡测试 配套代码 …
- 浸泡测试 3.5 浸泡测试:唯一能发现泄漏的测试 上一节:3.4 负载曲线 | 下一节:3.6 破坏性测试 配套代码 …
- 破坏性测试 3.6 破坏性测试:崩溃点与崩溃形态 上一节:3.5 浸泡测试 | 下一节:3.7 层级选择与成本 配套代码 …
- 层级选择与成本 3.7 层级选择与成本 上一节:3.6 破坏性测试 | 下一节:3.8 Lab 3 配套代码 …
- Lab 3 3.8 Lab 3:同一个接口的两层测试 上一节:3.7 层级选择与成本 | 下一节:第 4 章 工具链 配套代码 …