文档目录
优化与验证
本章定位:前六章找到了根因,这一章讲怎么改——以及更重要的:怎么证明改对了。
前置知识:第 5 章(噪声底线、显著性)、第 6 章(根因定位) 预计总时长:约 4 小时(阅读 2.5 小时 + Lab 7 约 1.5 小时) 配套代码:docs/code/07-optimization-and-validation/
一、本章要回答的七个问题
- 优化应该从哪开始?为什么「调 JVM 参数」永远排在最后?(第 1 节)
- 哪一类优化的收益最可靠、副作用最小?(第 2 节)
- 为什么「加线程/协程」可能让系统更慢?(第 3 节)
- 缓存为什么可能让 P99 变差?(第 4 节)
- 限流、熔断、隔板、超时、重试——它们分别防的是什么?(第 5 节)
- 连接池该设多大?为什么「越大越好」是错的?(第 6 节)
- 每项优化必须回答哪三个问题?(第 8 节)
二、为什么这一章的核心是「纪律」而不是「技巧」
优化技巧在网上到处都是(加缓存、用连接池、换序列化器)。真正的难点是:
| 技巧能解决的问题 | 纪律能解决的问题 |
|---|---|
| 我知道加缓存能提速 | 我该不该在这个接口加缓存? |
| 我知道批量能提升吞吐 | 收益够不够覆盖复杂度? |
| 我知道 ZGC 停顿低 | 我的瓶颈是吞吐还是延迟? |
技巧是「怎么做」,纪律是「该不该做」和「做完怎么证明」。
一件真实的事:
❌ 没有纪律:
改了 5 处,P99 从 400ms 到 220ms,团队庆祝。
三个月后 P99 又回到 400ms,没人知道为什么。
(因为其中 2 处改动其实无效,1 处引入了新问题)
✅ 有纪律:
每次只改一处,测完记录(提升多少 + 代价);
无效的改动被回滚(省下维护成本);
有效的改动被固化 + 加了回归门禁。
前者看起来快,后者才是真正的快。
三、小节地图
| 节 | 标题 | 一句话内容 | 时长 | 要动手 |
|---|---|---|---|---|
| 1 | 优先级金字塔:先问要不要做 | 不做的优化收益最高 | 20 min | ✅ 排序 |
| 2 | 减少工作:最可靠的一类优化 | 与其跑得快,不如少跑几趟 | 30 min | ✅ 实验 |
| 3 | 并发与并行:加资源不等于变快 | 并行度、隔离、避免共享 | 30 min | ✅ 实验 |
| 4 | 缓存:三重防护与三重代价 | 命中率、击穿、雪崩,以及它的代价 | 30 min | ✅ 实验 |
| 5 | 背压与韧性:保护自己也保护下游 | 限流、熔断、隔板、超时、重试 | 35 min | ✅ 实验 |
| 6 | 池化与复用:连接池要算,对象池要慎 | 池是闸门,不是越多越好 | 25 min | ✅ 计算 |
| 7 | JVM 调优:永远排在最后 | 先检查轮胎,再修发动机 | 25 min | ✅ 实验 |
| 8 | 优化的三问纪律与收益报告 | 提升多少?代价是什么?回归验证了吗? | 30 min | ✅ 模板 |
| 9 | Lab 7:优化 Lab 6 找到的瓶颈 | 走完「改 → 测 → 记录 → 否决」 | 90 min | ✅ 实验 |
四、本章的产出物
- 一张优化优先级清单:对你手上的问题,按金字塔排序,并说明为什么这个顺序。
- 1–3 项已实施的优化:每项含 before/after 数据、代价说明、回归验证结果。
- 至少一项被主动否决的优化:并写明理由。
- 一份优化收益报告:结构化、含置信区间与未覆盖场景。
五、学完本章的验收标准
- 能对一个优化任务按优先级金字塔排序,并说出为什么。
- 能识别「减少工作」类的优化机会(批处理、N+1、剪枝)。
- 能解释为什么「并行度越大越好」是错的。
- 能说出缓存的三个收益和三个代价。
- 能区分限流、熔断、隔板、超时、重试各自防的是什么。
- 能用 Little’s Law 推导连接池大小,而不是拍数字。
- 每项优化都能回答三个问题:提升多少、代价是什么、回归验证了吗。
- 至少主动否决过一项优化,并写明理由。
六、一个提醒:本章会让你的改动「变少」
学完第 5 章你知道了「多大的差异才算真实」,学完本章你会知道「哪些改动值得做」。
以前:能优化的都优化(并为此引入 5 个新组件)
现在:只优化那些「收益 > 代价 + 复杂度」的(可能只改 1 处)
改动变少,但每一处都有效、都被验证、都能长期维护。 这是性能工作从「手艺人」走向「工程师」的标志。
本节目录
- 优先级金字塔 7.1 优先级金字塔:先问要不要做 上一节:无 | 下一节:7.2 减少工作 配套代码 …
- 减少工作 7.2 减少工作:最可靠的一类优化 上一节:7.1 优先级金字塔 | 下一节:7.3 并发与并行 配套代码 …
- 并发与并行 7.3 并发与并行:加资源不等于变快 上一节:7.2 减少工作 | 下一节:7.4 缓存 配套代码 …
- 缓存 7.4 缓存:三重防护与三重代价 上一节:7.3 并发与并行 | 下一节:7.5 背压与韧性 配套代码 …
- 背压与韧性 7.5 背压与韧性:保护自己也保护下游 上一节:7.4 缓存 | 下一节:7.6 池化与复用 配套代码 …
- 池化与复用 7.6 池化与复用:连接池要算,对象池要慎 上一节:7.5 背压与韧性 | 下一节:7.7 JVM 调优 配套代码 …
- JVM 调优 7.7 JVM 调优:永远排在最后 上一节:7.6 池化与复用 | 下一节:7.8 优化的三问纪律 配套代码 …
- 优化的三问纪律与收益报告 7.8 优化的三问纪律与收益报告 上一节:7.7 JVM 调优 | 下一节:7.9 Lab 7 配套代码 …
- Lab 7 7.9 Lab 7:优化 Lab 6 找到的瓶颈 上一节:7.8 优化的三问纪律 | 下一节:第 8 章 持续化 配套代码 …