文档目录
工具链
本章定位:把前三章的方法论装进工具箱。学完你应该能在 5 分钟内回答:「这个现象,我该用哪个工具、采什么数据、怎么看。」
前置知识:第 2 章(JIT/GC/协程)、第 3 章(测试分层) 预计总时长:约 5 小时(阅读 3 小时 + Lab 4 约 2 小时) 配套代码:docs/code/04-toolchain/
一、本章要回答的七个问题
- 为什么「用 100 个并发用户压测」这件事本身可能就是错的?(第 1 节)
- 服务 CPU 只有 25% 但 P99 很高,该用哪个剖析工具?为什么 CPU 火焰图帮不上忙?(第 2、3 节)
- 有什么剖析工具可以在生产环境长期开着?(第 4 节)
sysCPU 时间很高、上下文切换很多,分别指向什么问题?(第 5 节)- 延迟指标的桶边界设错了会导致什么后果?(第 6 节)
- 怎么知道是「数据库慢」还是「等连接慢」?(第 7 节)
- 为什么「本地压测很好、上线就慢」——怎么用一条命令确认?(第 8 节)
二、为什么工具要「配套」而不是「会用」
一个常见的误区是:学会了火焰图,就以为能解决所有性能问题。
❌ 「我看了火焰图,没发现什么问题。」
这句话通常意味着三件事之一:
- 采错了事件:服务在等 IO,你却采了 CPU 火焰图 → 图很空 → 误判「没问题」。
- 缺了对照组:没有健康状态下的火焰图,看不出异常。
- 缺了指标:火焰图告诉你「时间花在哪」,但不知道「哪个指标异常」——没有指标就没有假设,没有假设就不知道该在火焰图里找什么。
所以本章强调「配套」:
指标(发现异常) → 假设(可能是哪里) → 剖析(验证假设) → 结论
↑ │
└──────────────── 新的指标 ← 优化 ←───────────────────┘
工具链的价值不在于单个工具多强大,而在于它们能互相验证。
三、小节地图
| 节 | 标题 | 一句话内容 | 时长 | 要动手 |
|---|---|---|---|---|
| 1 | 负载生成器:先选模型,再选工具 | 开环/闭环的差别,比工具选择的差别大得多 | 25 min | ✅ 实验 |
| 2 | 两类现象,两条路径 | CPU 高用 on-CPU;CPU 不高用 wall-clock | 15 min | — |
| 3 | async-profiler:四类火焰图 | cpu / alloc / lock / wall,各看什么 | 35 min | ✅ 实验 |
| 4 | JFR 与 jcmd:能常开的剖析 | JFR 可以在生产常开;jcmd 是无依赖应急 | 30 min | ✅ 实验 |
| 5 | 系统级观测:sys、steal 与上下文切换 | 从操作系统角度看"为什么慢" | 25 min | ✅ 命令 |
| 6 | 应用可观测性:指标、追踪、日志 | 直方图、基数控制、OTel、日志代价 | 30 min | ✅ 配置 |
| 7 | 数据与中间件观测 | 是数据库慢,还是等连接慢? | 25 min | ✅ 实验 |
| 8 | 容器与编排的干扰 | 「本地好、上线慢」的头号原因 | 25 min | ✅ 命令 |
| 9 | Lab 4:搭起最小观测回路 | 压测 → 服务 → 指标 → 火焰图 全打通 | 120 min | ✅ 实验 |
四、本章的产出物
- 一条完整观测回路:k6 压测 → 服务 → Prometheus/Grafana → 火焰图,全部能跑通。
- 四类火焰图:cpu / wall / alloc / lock,各一份,并能说出它们的差异。
- 一份 JFR 录制:用 JMC 打开并找出至少一条线索。
- 一次容器节流检查:确认你的环境有没有被 cgroup 配额掐停。
- 一套「现象 → 工具」对照表:针对你自己的服务,写清每种现象该采什么数据。
五、学完本章的验收标准
- 能解释开环与闭环的区别,并说出为什么开环优先。
- 能列出至少三种「压测机自己成为瓶颈」的迹象。
- 面对「CPU 不高但慢」,知道该采 wall-clock 而不是 CPU 火焰图。
- 能说出 JFR 与 async-profiler 的适用场景差异。
- 能读懂
sys高、steal高、上下文切换多分别意味着什么。 - 知道延迟指标必须走直方图,并能自己设置合理的桶边界。
- 能区分「数据库慢」与「连接池排队」。
- 能用 cgroup 指标确认容器是否被 CPU 节流。
六、一个提醒:工具也会说谎
本章会让你装很多工具。请记住两件事:
- 观测本身有成本:JFR 约 1%,某些剖析模式更高;日志同步刷盘可能占 10% 以上;Prometheus 高频抓取也要钱。
- 工具只能回答你问的问题:你采了 CPU 火焰图,它就只告诉你 CPU 的事。选错工具 = 得到「没问题」的错误结论。
这就是为什么第 2 节(两类现象两条路径)排在本章最前面——选对路径比会用工具更重要。
本节目录
- 负载生成器 4.1 负载生成器:先选模型,再选工具 上一节:无 | 下一节:4.2 两类现象,两条路径 配套代码 …
- 两类现象,两条路径 4.2 两类现象,两条路径 上一节:4.1 负载生成器 | 下一节:4.3 async-profiler 一句话结论 剖析工具选错的代价,是得到「没有瓶颈」 …
- async-profiler 4.3 async-profiler:四类火焰图 上一节:4.2 两类现象,两条路径 | 下一节:4.4 JFR 与 jcmd 配套代码 …
- JFR 与 jcmd 4.4 JFR 与 jcmd:能常开的剖析与无依赖应急 上一节:4.3 async-profiler | 下一节:4.5 系统级观测 配套代码 …
- 系统级观测 4.5 系统级观测:sys、steal 与上下文切换 上一节:4.4 JFR 与 jcmd | 下一节:4.6 应用可观测性 配套代码 …
- 应用可观测性 4.6 应用可观测性:指标、追踪、日志 上一节:4.5 系统级观测 | 下一节:4.7 数据与中间件观测 配套代码 …
- 数据与中间件观测 4.7 数据与中间件观测:是数据库慢,还是等连接慢? 上一节:4.6 应用可观测性 | 下一节:4.8 容器与编排的干扰 配套代码 …
- 容器与编排的干扰 4.8 容器与编排的干扰:「本地好、上线慢」的头号原因 上一节:4.7 数据与中间件观测 | 下一节:4.9 Lab 4 配套代码 …
- Lab 4 4.9 Lab 4:搭起最小观测回路 上一节:4.8 容器与编排的干扰 | 下一节:第 5 章 实验设计与方法论 配套代码 …