排障心智模型:现象、假设、分层与复盘

一句话模型

排障是用最小成本的证据,把“用户看到的现象”逐步收敛到“系统里可修复的机制”。

核心概念

1. 现象与根因

现象是用户或监控能观察到的事实:5xx、延迟升高、CPU 饱和、Pod 未就绪。根因是导致现象的系统机制,例如连接池耗尽、DNS 超时、磁盘只读或锁等待。同一个现象可能有多个根因,同一个根因也可能表现为多种现象。排查的目标不是解释现象,而是找到可验证、可修复的那一层。

2. 假设与验证

每次只提出一个可证伪的假设:“如果是数据库连接耗尽,那么 pg_stat_activity 的连接数应接近上限。”然后选择成本最低、区分度最高的命令验证。记录预测和结果,假设被推翻也是有效进展。同时改多个变量会让你无法判断哪个动作生效,也会破坏现场。先取证,再变更。

3. USE 与 RED

USE 面向资源:Utilization(使用率)、Saturation(饱和度)、Errors(错误),适合 CPU、内存、磁盘、网络和连接池。RED 面向服务:Rate(请求速率)、Errors(错误率)、Duration(延迟),适合接口和依赖。两套方法互补:RED 发现用户体验变差,USE 帮你找到承载资源的瓶颈。指标要结合基线看,绝对值本身很少说明问题。

4. 分层排查

系统是分层的:客户端 → DNS → 负载均衡 → 网关 → 应用 → 依赖 → 数据库 → 磁盘。网络又分 L2/L3/L4/L7,Kubernetes 又分 Pod、节点、控制面。每一层都有独立的证据来源,例如 dig、ss、curl、tcpdump、kubectl describe。分层不是从上到下机械走一遍,而是用证据决定下一层往哪走。

5. 变更关联

大多数故障发生在变更之后:发布、配置、证书、权限、网络策略、容量和流量。先建立时间线,把故障开始时间与部署、扩缩容、云事件和依赖变更对齐。变更关联不等于因果,但能显著缩小假设空间。证书到期、配额用尽和连接数增长属于“没有变更的变更”,也要纳入检查。

6. 复盘

复盘要还原时间线、影响范围、检测方式、响应过程、直接原因和贡献因素,并产出有负责人和截止时间的行动项。复盘的目的不是追责,而是改进系统:补监控、加护栏、简化回滚、消除同类隐患。行动项必须可验证,否则下一次故障会以同样的方式发生。

概念关系

维度 要回答的问题 典型证据
现象 谁受影响、影响多大、从何时开始 告警、SLO、用户反馈
范围 单实例、单可用区还是全局 分维度指标、日志分布
层次 请求停在哪一跳 dig、ss、curl、追踪
资源 哪类资源饱和或报错 USE 指标、cgroup、dmesg
变更 最近改了什么 发布记录、配置 diff、证书
结论 哪个机制可复现 最小复现、修复验证
现象 → 界定范围 → 建立时间线 → 分层定位 → 假设验证 → 止损/修复 → 验证 → 复盘

止损和根因分析可以并行:先控制影响,再继续取证。不要在用户仍在受损时坚持“找到根因再处理”。

常见误解

读完自测

合上页面,先回答,再展开对照。

  1. 现象和根因有什么区别?为什么不能停在现象层?
  2. USE 和 RED 分别适合什么对象?如何配合使用?
  3. 为什么说“变更关联不等于因果”?应该怎样验证?
答案
  1. 现象是观察到的结果,根因是产生结果的系统机制。停在现象层只能缓解症状,例如反复重启 Pod,无法防止复发;根因必须能解释现象、可复现并可验证修复。
  2. USE 面向资源,检查使用率、饱和度和错误;RED 面向服务,检查请求速率、错误率和延迟。通常先用 RED 确认用户影响,再用 USE 定位承载资源的瓶颈,最后用分层证据确认具体组件。
  3. 变更时间接近只能提高嫌疑,不能证明因果。验证方法是确认变更与故障的机制联系、检查回滚或对比组、确认没有其他同时发生的变化,并用最小复现证明“去掉该变更后现象消失”。

相关条目