第1章 导论:先把「系统慢了」拆成能继续分析的问题

第1章真正立住的不是概念,而是性能分析的起手纪律:先把「慢」客观化、定边界、拿轻量快照,再决定往哪层收缩。

本页目录

先把“系统慢了”拆开

性能问题不能用“系统慢了”起手。这句话太大,里面混着不同对象、不同指标和不同层次的问题。你不先拆开,后面所有人都会按自己的理解去查,越查越散。

先做的不是找工具,也不是找那个“唯一根因”,而是把主观抱怨压成能继续分析的问题。

真实系统里经常不是一个点坏了,而是几个因素一起叠加。排障起手的目标不是立刻抓凶手,而是先定边界,判断当前最值得继续追的限制因素。

先把主观抱怨压成客观延时

“慢”首先是主观感受。不同人嘴里的“系统慢了”,可能指的是不同接口、不同时间段、不同程度的退化。

所以第一步不是争论感受,而是把它翻译成延时、吞吐、错误率这些可测指标。这里最该优先钉住的是延时,因为延时最接近用户体验,也最适合后面估算修复收益。

如果你连“平时 10ms,现在 100ms”这种量化都没有,后面所有判断都容易失真。你甚至没法判断问题到底有多严重,也没法在修完以后确认收益。

别把“系统慢了”直接翻成资源不够

最常见的错法有五种:

  • 还没把问题定义清楚,就直接说“先查 CPU”或“先看数据库”
  • 把“系统慢了”当成一个完整问题,而不是待拆解的问题集合
  • 觉得必须先把系统看全,才能开始分析
  • 把导论当成背景页,直接跳去读 CPU、内存、磁盘、网络
  • 看到使用率高就立刻宣布资源不够

这些错法的共同点,是都太早下场,太早选方向。

尤其要防“使用率高 = 性能瓶颈”这个直觉。资源一直很忙,不等于业务已经被它拖慢。真正会伤害延时的,是饱和和排队。忙碌只是线索,排队才更接近结论。

以后遇到“系统慢了”,先做这 4 步

先做下面这 4 步,不要抢答。

1. 先说清症状边界

至少先说清这几个边界:

  • 慢的是谁:接口、任务、页面、请求、批处理,还是某一类操作
  • 慢成什么样:平均值升高、尾延时恶化、吞吐下降,还是错误率上升
  • 影响多大:单实例、局部流量,还是整体退化
  • 从什么时候开始:突然出现、周期抖动,还是逐步变坏

还要补一条纪律:别只说“大家都觉得慢”。先把主观抱怨客观化,优先写出延时变化。只要这一步还说不清,就不要急着选方向。

2. 再拿一轮最小快照

这里不用追求“数据越多越好”。够支撑下一步判断就行。

至少包括:

  • 当前症状的时间范围
  • 受影响对象和范围
  • 最显眼的资源域异常
  • 前后差异:变更、版本、流量、环境
  • 运行环境边界:裸机、虚拟机、容器、托管平台

这里的快照,不是重武器,不是 tracing,也不是先把全系统抓一遍。

起手应该是轻量级、低干扰、系统自带的那类检查动作。原书给出的意思很明确:先用一轮便宜、快速、足够广的观察拿到大盘线索,再决定要不要继续上更重的工具。

拿完这轮快照,你至少要知道问题大概落在哪、影响到哪、边界有多大。

3. 再决定先往哪层走

拿到问题定义和最小快照以后,才开始做第一轮方向判断。

这时候先问下面这几件事:

  • 这更像工作负载变了,还是资源约束变了
  • 这更像运行变长,还是等待变长,还是排队变长
  • 这更像整体问题,还是局部路径问题
  • 这更像应用问题,还是系统问题,还是环境边界问题

这里可以把两个视角分清。

工作负载视角是自上而下看请求、延时和流量形状,回答“业务到底在施加什么压力”。资源视角是自底向上看 CPU、内存、磁盘和网络,回答“底层到底有没有在排队、报错或顶满”。复杂问题往往要两边一起看,不能只让开发和运维各说各话。

第一轮方向站住了,后面再下钻才不会乱。

4. 最后才决定上什么工具

重型工具不是起手动作。工具是补证手段。

问题还没定义清楚时,工具越重,噪声往往越大。轻量快照可以尽早上,但剖析、跟踪这类更重的工具,应该留给问题已经收缩到足够具体的时候。

忙碌不等于已经形成约束

第 1 章虽然是导论,但已经在拦一个后面会反复出现的误判:高使用率不等于性能已经恶化。

如果一个资源只是一直在忙,但还能持续处理工作,它未必就是当前瓶颈。真正更值得找的,是饱和和排队,也就是新的工作已经进不去了,只能在那儿等。

以后你再看到 CPU、磁盘、网络某个指标很高,先别宣布根因。先追问:有没有排队证据,延时是不是因此变长,等待是不是已经变成了主要损耗。

视角受限时,继续靠边界证据推进

  • 接受你看不全,这不是例外,是现代环境的常态
  • 不再依赖“我必须拿到底层全量指标”这个前提
  • 优先保留边界证据:实例间差异、可用区差异、版本前后差异、流量分布差异
  • 把环境约束本身当成分析对象:配额、邻居干扰、宿主共享、托管限制
  • 用对照和变化继续推进,而不是等全视角到齐

记住这句就够了:视角受限时,分析方法也要跟着变。

先把对象、范围和快照固定住

先把“慢”的对象、表现、范围、起点说清

先按这个顺序走:

  1. 把“慢”的对象、表现、范围、起点说清。
  2. 把主观抱怨压成延时、吞吐、错误率这类客观指标。
  3. 拿一轮最小快照,先看时间范围、影响范围、显眼异常和前后变化。
  4. 判断先往哪层走,不要抢着进自己最熟的资源域。
  5. 方向缩小后,再决定工具。

快照里至少放这 6 项

快照里至少要有这些:

  • 时间范围
  • 受影响对象
  • 影响范围
  • 最显眼异常
  • 版本、流量、配置或环境变化
  • 当前运行环境边界

先把这三条纪律钉住

  • 问题没说清前,不选资源域。
  • 快照没拿到前,不下重结论。
  • 方向没缩小前,不上重工具。

什么时候该停

性能分析可以一直往下钻,但不是每次都值得。

至少有三种情况该停下来:

  1. 你已经解释了大部分延时损耗,继续下钻只会换来更细的细节,不会显著改变动作。
  2. 继续分析的工程成本已经高过可能带来的收益。
  3. 现场还有别的限制因素,投资回报率比当前这个问题更高。

能停下来,不是偷懒,而是在用工程收益而不是技术好奇心做排序。

问题说清以后,再决定往哪一层收缩

第 1 章把问题语言和起手纪律立住。第 2 章接着回答的,才是:问题定义以后,应该按什么顺序继续收缩问题空间,什么时候做分流,什么时候换证据,什么时候继续下钻。