知识卡片
故障排查是反向推导:原因、传播路径、现象之间不是一一对应关系
内容
设计系统或写代码是一个正向推导的过程(从需求出发推出实现),而排查线上问题恰恰相反,是一个反向推导的过程——看到玻璃碎了,要倒推回去是谁用弹弓打的,这个反向过程往往比正向理解原因或解决问题要复杂得多。几乎所有影响线上系统可用性的问题,都可以概括成同一种模式:”一个根本原因,经过一条或几条传播路径,最后表现出某些现象”,比如某服务内存泄漏,导致操作系统开始使用swap、处理变慢、依赖它的服务超时、处理线程堆积,最终这个服务整体不可用——内存泄漏是根本原因,服务不可用是现象,中间那些环节都是传播路径。但这个”原因→路径→现象”的模式有一个极其重要、容易被忽视的特点:三者之间不是一一对应的关系。同一个现象(比如应用吃swap)背后可能对应完全不同的原因(堆外内存泄漏、机器上启动了其他消耗内存的程序、numa配置引发的问题);反过来同一个原因(堆外内存泄漏)也可能通过不同的传播路径,表现出完全不同的现象(可能导致吃swap,也可能导致OOM,甚至可能什么明显现象都没有)。这个非一一对应的特性直接决定了单纯记忆”A会引发B”这类具体案例,对未来排查新问题的帮助其实相当有限——遇到表现相同的问题,原因和路径可能完全不一样;遇到相同的原因,也可能通过不同路径表现出截然不同的现象。这个洞察提示了一条系统排障方法论的重要认知:真正值得积累的不是”某个具体故障案例的因果对应关系”,而是”面对某类现象时,有哪些手段可以帮助进一步分析”这类更通用、可迁移的排查思路,前者容易随着系统和场景变化而失效,后者才是真正能沉淀下来、应对层出不穷新问题的能力。
参考来源
- 位置:《高可用架构(第1卷)》第5章《运维保障》"5.4 微博在大规模、高负载系统问题排查方法"节,"5.4.2 排查方法及线索"(源文件:_epub-src/OEBPS/Text/Chapter5_4_3.xhtml)
- 结论依据:原文说明"对于影响线上系统可用性的问题,都可以总结成这样一种模式:一个根本原因,经过一条或几条传播路径,最后表现出某些现象……但原因、路径和现象不是一一对应的……单纯地看一些案例,了解'A会引发B',对于今后问题排查来说会有一些帮助,但是帮助不大",直接支撑本卡片结论。
- 原始内容:对于影响线上系统可用性的问题,都可以总结成这样一种模式:一个根本原因,经过一条或几条传播路径,最后表现出某些现象……但原因、路径和现象不是一一对应的……单纯地看一些案例,了解"A会引发B",对于今后问题排查来说会有一些帮助,但是帮助不大。