告警风暴的成因:重复告警、抖动告警、间歇性告警的根因分析

告警风暴,说白了就是一瞬间告警像雪崩一样砸过来。我见过最夸张的一次,某电商平台大促期间,5分钟内涌入了12万条告警。值班同学直接懵了,屏幕上的告警列表滚都滚不动。嗯,这种场景下,真正重要的故障反而被淹没了。

要治理告警风暴,得先搞清楚它怎么来的。我个人习惯把告警风暴的根因分成三类:重复告警抖动告警间歇性告警。这三兄弟各有各的脾气,咱们一个一个拆解。

一、重复告警:同一个问题,反复报

重复告警是最常见、也最好理解的一种。你想想看,一个磁盘满了,监控每5秒采集一次,每次采集都触发告警。一分钟下来就是12条,一小时就是720条。这就是典型的重复告警。

核心问题:告警规则没有做“防抖”或“聚合”处理。监控系统只负责采集和触发,它不管这条告警之前有没有报过。

我在项目中遇到过最离谱的一次,一个Nginx进程挂了,监控脚本每10秒检查一次进程状态,每次检查都发一条告警。结果一晚上生成了8000多条告警。后来一查,告警接收人早就把手机静音了——因为实在受不了那个震动频率。

根因分析:

  • 监控粒度太细:采集周期设置过短,比如1秒、5秒。其实对于大多数基础设施指标,30秒到1分钟完全够用。
  • 缺乏告警聚合:没有把相同主机、相同指标的告警合并成一条。比如“主机A磁盘使用率>90%”这种告警,应该只发一条,而不是每次采集都发。
  • 恢复告警缺失:有些系统只触发告警,不触发恢复。结果告警一直处于“触发中”状态,系统就一遍遍重复发送。
我的建议:告警规则里一定要加“告警间隔”参数。比如设置“同一个告警至少间隔5分钟再发第二次”。这样即使问题持续存在,也不会刷屏。

二、抖动告警:指标在阈值边缘反复横跳

抖动告警比重复告警更恶心。它不是说一直报,而是报了又恢复、恢复了又报。你想想看,CPU使用率在89%和91%之间来回波动,阈值设的是90%。那结果就是:告警→恢复→告警→恢复……

这种告警对值班同学的心理伤害最大。我记得有一次,一个数据库的连接数在阈值附近波动,一晚上触发了200多次告警和200多次恢复。值班同学半夜爬起来看了三次,每次都是“看一眼,恢复了,继续睡”,然后刚躺下又响了。

根因分析:

  • 阈值设置不合理:单阈值策略太脆弱。指标稍微波动一下就会触发。
  • 缺乏“持续时长”判断:很多告警规则是“超过阈值就告警”,没有要求“持续超过阈值N分钟才告警”。
  • 业务本身有周期性波动:比如每天早上8点、晚上8点有流量高峰,但阈值是固定的。
避坑指南:我曾经吃过一次大亏。一个核心服务的延迟告警,我设了单阈值200ms。结果业务高峰期延迟在180ms到220ms之间波动,一晚上告警恢复了几百次。后来我改成“连续3个采集周期超过200ms才告警”,世界瞬间清净了。

解决方案:

  1. 使用“持续时长”参数:比如“CPU使用率>90%持续5分钟才告警”。
  2. 设置“恢复延迟”:指标回落到阈值以下后,再等2分钟才发恢复通知。避免频繁切换。
  3. 采用动态阈值:根据历史数据自动计算阈值,而不是拍脑袋定一个固定值。

三、间歇性告警:时有时无,最难排查

间歇性告警是最让人头疼的。它不像重复告警那样规律,也不像抖动告警那样频繁。它可能一天出现几次,每次持续几分钟,然后就自己消失了。你去看的时候,一切正常。你不管它,它又冒出来了。

我印象最深的一次,一个支付服务的错误率告警,每天下午2点到4点之间会出现3-5次,每次持续1-2分钟。我们排查了整整两周,最后发现是某个上游服务的GC停顿导致的。GC每次停顿几百毫秒,刚好导致支付请求超时,但GC一结束,服务又恢复正常了。

根因分析:

根因类型 典型场景 排查难度
资源竞争 CPU争抢、内存争抢、IO争抢 中等
依赖服务抖动 上游服务GC、网络抖动、DNS解析超时
定时任务冲突 整点任务、凌晨备份、日志轮转
配置变更 灰度发布、配置热加载、限流策略调整

排查思路:

  • 时间关联分析:把告警时间点和所有变更记录、定时任务、GC日志对齐。我习惯用时间轴图来对比。
  • 指标关联分析:看告警发生时,其他相关指标有没有异常。比如错误率升高时,CPU、内存、网络有没有波动。
  • 日志采样:在告警触发时,自动抓取相关服务的日志片段。很多间歇性问题,事后看日志是看不出来的。
一个小技巧:对于间歇性告警,我建议在告警规则里加一个“告警标签”,比如带上“间歇性”标记。这样值班同学看到就知道“这个告警可能查不出原因,先记录一下”。避免每次都要从头排查。

四、三种告警的对比与治理策略

三种告警的根因不同,治理手段也不一样。我整理了一个对比表,方便你快速参考:

告警类型 核心特征 根因 治理手段
重复告警 同一问题反复报 采集粒度太细、缺乏聚合 设置告警间隔、告警聚合
抖动告警 阈值边缘反复横跳 单阈值策略、缺乏持续时长 持续时长判断、恢复延迟、动态阈值
间歇性告警 时有时无、难以复现 资源竞争、依赖抖动、定时任务 时间关联分析、指标关联、日志采样

说白了,告警风暴的治理不是一蹴而就的。我个人习惯是:先治重复,再治抖动,最后攻坚间歇性。因为重复告警的治理成本最低、效果最明显。把重复告警干掉,告警量至少能降80%。

五、知识体系结构图

下面这张图展示了告警风暴的三种成因及其治理路径,你可以对照着梳理自己的告警体系:

告警风暴成因与治理路径 告警风暴 重复告警 抖动告警 间歇性告警 采集粒度太细 缺乏告警聚合 恢复告警缺失 单阈值策略脆弱 缺乏持续时长判断 业务周期性波动 资源竞争 依赖服务抖动 定时任务冲突 治理顺序:先治重复 → 再治抖动 → 最后攻坚间歇性

嗯,到这里告警风暴的三种成因就讲清楚了。记住一个原则:告警不是越多越好,而是越准越好。把重复和抖动干掉,你的值班同学会感谢你的。


专注资料整理