第3章:故障树分析(FTA)——从根因到顶事件的逻辑拆解

故障树分析,简称FTA。说实话,这玩意儿是我在稳定性领域里用得最顺手的工具之一。它不像某些玄学排查法,靠拍脑袋猜原因。FTA有一套严谨的逻辑,能把一个系统级故障,一层层拆到最底层的元器件失效或人为失误。

我最早接触FTA是在做核电DCS系统的时候。那时候甲方要求每个安全功能必须建故障树,算最小割集。一开始觉得烦,后来真出了事故,对照故障树一查,十分钟定位根因。嗯,从那以后,我再也没跳过这步。

3.1 故障树的基本符号

先认识一下“积木块”。故障树里符号不多,但每个都有明确含义。搞混了,树就歪了。

符号 名称 含义
矩形 顶事件 / 中间事件 需要分析的故障结果,继续往下拆
圆形 底事件 最基本的失效原因,不再往下分解
菱形 未展开事件 已知原因但暂不展开,或数据不足
房形 条件事件 触发故障的特定条件或约束
三角形 转移符号 子树引用,避免一张图画不下
我的习惯:底事件一定要用圆形,别偷懒用矩形代替。我在一次评审会上见过有人把底事件画成矩形,结果评审专家追问“这个还能不能再拆?”——场面一度很尴尬。

3.2 顶事件与底事件

顶事件就是故障树最上面那个矩形。它代表你关心的那个系统级故障。比如“数据库服务不可用”、“支付接口超时率超过5%”。

底事件是树的最底层叶子节点。它们必须是“不可再分”的原子原因。比如“CPU温度超过85℃触发降频”、“磁盘写入队列深度超过512”。

这里有个坑:底事件的粒度要一致。你不能左边叶子是“内存ECC错误”,右边叶子是“机房空调坏了”——粒度差太多,树就不平衡了。

我曾经踩过的坑:有一次做微服务故障树,把“依赖服务A返回500”当成了底事件。后来发现服务A本身还有更底层的故障原因。结果整棵树白建了,得重来。记住:底事件必须是你能直接采取行动的那个层级。

3.3 逻辑门:与门和或门

逻辑门是故障树的“骨架”。说白了,就是描述下层故障怎么组合成上层故障。

3.3.1 与门

与门表示:所有输入事件同时发生,输出事件才发生。

举个例子:一个双路冗余电源系统,只有“电源A失效”且“电源B失效”同时发生,才会导致“系统掉电”。这就是与门。

与门在故障树里用圆弧底的门形符号表示。它的特点是:并联冗余越多,系统越可靠。

3.3.2 或门

或门表示:只要有一个输入事件发生,输出事件就发生。

还是那个电源系统,如果改成单路供电,那么“电源A失效”或“电源B失效”都会导致“系统掉电”。这就是或门。

或门用尖底的门形符号表示。它的特点是:串联环节越多,系统越脆弱。

对比项 与门 或门
逻辑关系 全部发生才发生 任一发生就发生
对可靠性的影响 提高(冗余) 降低(单点)
最小割集数量 少(组合条件苛刻) 多(触发条件宽松)
实际场景 主备切换、双路供电 单点故障、依赖链断裂
核心观点:你去看一个系统的故障树,如果或门特别多,说明这个系统到处都是单点故障。如果与门多,说明设计者做了冗余。一眼就能看出架构水平。

3.4 最小割集求解

割集,就是一组底事件的集合。这组底事件同时发生时,顶事件必然发生。

最小割集,就是不能再精简的割集。去掉任何一个底事件,顶事件就不会发生。

为什么要求最小割集?因为它是系统最脆弱的“命门”。你想想看,一个最小割集就是一个独立的故障路径。路径越短,风险越高——单点故障就是长度为1的最小割集。

3.4.1 下行法(Fussell-Vesely算法)

这是我最常用的方法。思路很简单:从顶事件往下走,遇到与门就把输入事件排成一行,遇到或门就把输入事件排成一列。

具体步骤:

  1. 从顶事件开始,逐层替换逻辑门
  2. 遇到与门:子事件横向展开(同一行)
  3. 遇到或门:子事件纵向展开(不同行)
  4. 直到所有门都被替换成底事件
  5. 去重、吸收(去掉包含其他割集的割集)

举个例子,假设故障树结构如下:

顶事件 T = (A 或 B) 与 (C 或 D)

第一步:T = (A 或 B) 与 (C 或 D)
第二步:遇到与门,横向展开 → (A 或 B) (C 或 D)
第三步:遇到或门,纵向展开 →
  行1: A C
  行2: A D
  行3: B C
  行4: B D
第四步:全部是底事件,结束
第五步:没有重复,最小割集为 {A,C}, {A,D}, {B,C}, {B,D}
避坑指南:下行法最怕遇到重复事件。比如同一个底事件出现在不同分支,最后一定要做“吸收”操作——如果割集{A,B}和{A,B,C}同时存在,去掉{A,B,C},因为{A,B}已经能触发顶事件了。

3.4.2 上行法

上行法是从底事件往上推。从最底层开始,用逻辑门表达式逐层替换,最终得到顶事件的布尔表达式。

还是上面那个例子:

底层:G1 = A + B   (或门用+表示)
      G2 = C + D   (或门用+表示)
顶层:T = G1 · G2  (与门用·表示)

代入:T = (A + B) · (C + D)
展开:T = A·C + A·D + B·C + B·D

最小割集:{A,C}, {A,D}, {B,C}, {B,D}

上行法适合手工计算小树。大树还是用下行法配合计算机更靠谱。

3.5 知识体系总览

下面这张图把本章的核心逻辑串起来了。你一看就明白:从符号到门,从门到割集,层层递进。

故障树分析(FTA)知识体系 基本符号 顶事件与底事件 逻辑门 最小割集 符号类型 矩形 / 圆形 / 菱形 房形 / 三角形 各符号使用场景 事件层级 顶事件:系统级故障 中间事件:可再分 底事件:原子原因 逻辑门类型 与门:全部发生才发生 或门:任一发生就发生 对可靠性的影响 割集求解 下行法 上行法 吸收去重 核心输出:最小割集列表 每个割集 = 一条独立的故障路径,路径越短风险越高 工程应用 根因定位 | 可靠性评估 | 设计改进 | 测试用例生成 FMEA补充 | 安全完整性等级(SIL)验证 注意 底事件粒度一致

3.6 实战建议

最后聊点实际的。FTA不是画完就完事的,它要落地。

  • 建树前先定边界:系统边界在哪?哪些故障不考虑?我见过有人把“太阳耀斑爆发”都写进故障树——不是不行,但你先想想你能不能控制。
  • 最小割集要排序:按长度排序,优先处理长度为1的单点故障。这是性价比最高的改进点。
  • 结合FMEA一起用:FMEA找失效模式,FTA找逻辑组合。两个工具互补,效果1+1>2。
  • 工具辅助:小树手算,大树用工具。我常用OpenFTA和CAFTA,免费的也有。
一句话总结:故障树就是一张“故障地图”。最小割集就是地图上的“地雷”。你把这些地雷排了,系统自然就稳了。