别再被“关联性背锅”了:基于因果推断做根因定位,到底靠不靠谱?

举报
Echo_Wish 发表于 2025/12/17 21:34:42 2025/12/17
【摘要】 别再被“关联性背锅”了:基于因果推断做根因定位,到底靠不靠谱?

别再被“关联性背锅”了:基于因果推断做根因定位,到底靠不靠谱?

兄弟们,今天咱说点狠的——运维圈最容易掉坑的概念:相关性 ≠ 因果性。
你在监控大盘上看到 CPU 飙升的时候磁盘 I/O 也抖了,你第一反应是什么?

“这俩有关系!CPU 拉高肯定导致 I/O 抖动!”

但很可能真相是:

  • CPU 和 I/O 都被 upstream 的一个垃圾 SQL 干废了
  • 你却把脏锅甩给了 CPU
  • 最后业务老板一通电话骂运维:“怎么 CPU 又炸了你不扩容?!”

这就是相关性害人
今天我们换一个视角——基于因果推断(Causal Inference)的根因定位

先说结论:
因果推断不是银弹,但比纯相关分析更靠谱,也更接近真实世界。
尤其是 AIOps、分布式链路、SLO 体系下,它简直就是心理按摩神器。


一、为什么“相关”是个坑?

因为相关性太廉价了。

随便举例:

气温越高,冰淇淋销量越大
溺水死亡人数也越高

这俩指标相关度接近 0.9,你能说:

“冰淇淋导致溺水”吗?

要这么拍脑袋,得送你去参加奇葩说。

运维圈也一样:

  • Latency 高的时候 QPS 也升
  • A 服务抖时 B 服务也炸
  • 垃圾回收一触发,响应时间飞天

这些都叫现象伴随
并不是因果链路

所以光靠 Pearson correlation、Spearman、互信息这些统计相关性工具做根因定位,和占卜半斤八两。


二、什么叫因果推断?

简单一句话:

因果推断关心的是干预后的结果,而不是观察到的共付现象。

Pearl 的因果三层结构是:

  • 关联层( Association):变量之间“看上去相关”
  • 干预层( Intervention):如果我动它,结果会变吗?
  • 反事实层( Counterfactual):如果当时不动它,会怎样?

真正运维要解决的恰恰是第二层:

哪个变量值得干预?

例如:

  • CPU 并不导致延迟,是延迟触发了线程堆积、CPU 才升
  • 内存飙升只是结果,真正原因是内存泄漏
  • 下游爆了,导致你上游的重试堆积

这不是一句 correlation 能解释的。


三、用代码演示:相关欺骗 vs 因果识别

假设我们模拟一个运维故障:

  • 数据库超时 导致 服务延迟
  • 延迟升导致 CPU 升
  • 所以 CPU 与延迟高度相关,却不是因

我们造个数据:

import numpy as np
import pandas as pd
from sklearn.linear_model import LinearRegression

np.random.seed(42)

db_timeout = np.random.binomial(1, 0.3, 1000)  # 根因
latency = db_timeout * 50 + np.random.normal(5, 2, 1000)
cpu = latency * 0.3 + np.random.normal(2, 1, 1000)

df = pd.DataFrame({"timeout": db_timeout, "latency": latency, "cpu": cpu})
print(df.corr())

你会看到:

  • latency 与 cpu 相关性极高(>0.9)
  • timeout 与 cpu 低一些

但真正原因是 timeout,不是 latency。

如果只看相关性,我们会怪 latency。
这就是典型的运维误判。


四、因果推断怎么玩?

① 用 DAG 表达依赖关系

比如:

DB Timeout --> Latency --> CPU

这类图可以用 networkx 或 causal-learn 构建。


② 用干预检验(do-calculus)

如果我强行拉高 CPU,延迟会变吗?不会。
但我触发 DB timeout,延迟瞬间飙。

这才叫因果影响力

很多自动根因定位系统(阿里、京东、微软)都玩这个。


③ 用打分做引用

评分指标通常包括:

  • 吸收力(descendant effect)
  • 出口阻塞(bottleneck effect)
  • 干预敏感度
  • 影响传播路径

一句话:
谁的动能最大,谁就是元凶。


五、回到实战场景:APM 中因果定位怎么落地?

✔ 分布式追踪是地图

你得知道:

  • 谁调用谁
  • 谁阻塞谁
  • 谁扇区传播

OpenTelemetry、Jaeger 就是因果网络的观察器。


✔ 指标依赖树是植发梳子

比如 SLI:

Latency = Queue Delay + Service Time
Queue Delay = concurrency/worker
Service Time = DB IO + CPU cost

你知道各个节点之间的公式,这叫结构方程模型
它能告诉你:

latency 的增长到底来自哪个组件的贡献?

这比相关性强多了。


✔ 故障复盘靠反事实分析

反事实就是:

“如果当时我限制一下重试,会不会没爆?”

这对容量规划、熔断策略极其重要。


六、说点实话:因果推断不是万能药

我给你几点大实话:

✘ 没有足够观测数据,因果推断是白搭

垃圾数据只能算命,不是推断。

✘ 没有结构知识,你推不出 DAG

全靠 AI 猜 DAG,只会猜出屎。

✘ 干预成本太高

你敢在生产上随便想实验参数?
大概率会被开除。

所以因果推断要落地,三个条件缺一不可:

  1. 观测数据足够丰富
  2. 系统依赖能表达
  3. 允许小规模实验(AB、压测)

七、到底比相关性更可靠吗?

我这么说吧:
相关性像问:你俩天天一起出现,是不是搞对象?
因果推断像问:你俩去办证了吗?是不是结婚了?

  • 相关:只是观察
  • 因果:是证明

所以根因定位不是“看起来像”,而是“证据链闭环”。

是不是比相关性更靠谱?
是。
但要能落地,还得看业务实际情况。


八、我对因果的态度:谨慎但支持

我接触过三类团队:

  1. 迷信因果 ——觉得它无所不能
  2. 拒绝因果 ——觉得玄乎
  3. 合理使用 ——把它当理性工具

我劝你做第三类。

它不是魔法,但:

  • 帮你沉淀依赖结构
  • 帮你做灰度决策
  • 帮你强化 SLO 和容量治理

它让定位根因变得更稳、更有逻辑、也更有安全感。


九、最后一句话:别把锅甩错了

很多运维事故不是技术问题,而是:

  • 决策基于错觉
  • 认知基于相关
  • 行动基于猜测
【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。