4. 阈值设定:静态阈值 vs 动态阈值,以及基于百分位数的异常检测
聊到告警规则,最核心的问题就是:阈值设多少才合适?
我见过太多团队,上来就拍脑袋设个“80%”。结果呢?白天业务高峰期疯狂告警,半夜又静悄悄。说白了,这种静态阈值就像用一把尺子量所有人的脚——肯定不合适。
这一讲,我们就来拆解阈值设定的三种思路:静态阈值、动态阈值、百分位数检测。我会结合真实案例,告诉你什么时候该用哪种。
4.1 静态阈值:简单,但别滥用
静态阈值,就是固定一个数值。比如“CPU > 90% 就告警”。
它的优点很明显:容易理解,部署快。你甚至不用写一行代码,在监控系统里配一下就行。
但缺点也致命:不灵活。
我记得有一次,一个电商团队给数据库连接数设了静态阈值 200。平时没问题,但双十一大促时,连接数飙到 500 都算正常。结果告警刷屏,值班同学直接麻木了。这就是典型的“告警疲劳”。
- 资源上限明确的场景(如磁盘空间 100%)
- 合规性要求(如响应时间不能超过 5 秒)
- 临时监控,快速验证
4.2 动态阈值:让机器帮你调参
动态阈值,说白了就是基于历史数据自动计算阈值。系统会学习过去 N 天的指标规律,然后给出一个“合理范围”。
我建议你重点关注两种方法:
4.2.1 基于均值和标准差
这是最基础的方法。假设过去 7 天同一时刻的 CPU 使用率是 30%、32%、28%、31%、29%、33%、30%。
计算均值 μ = 30.4,标准差 σ = 1.7。那么动态阈值可以设为:
上界 = μ + 3σ = 30.4 + 5.1 = 35.5%
下界 = μ - 3σ = 30.4 - 5.1 = 25.3%
当 CPU 超过 35.5% 或低于 25.3% 时,触发告警。
嗯,这里要注意:3σ 不是万能的。如果数据本身不符合正态分布,这个方法的误报率会很高。我在项目中遇到过,某个服务的延迟分布是长尾的,用 3σ 检测,每天告警几百次,全是假阳性。
4.2.2 基于时间序列分解
更高级的做法,是把指标拆成三部分:
- 趋势项:长期上升或下降
- 季节项:每天的周期性波动
- 残差项:随机噪声
动态阈值只对残差项做检测。这样就能避免“白天流量高就告警”的尴尬。
你想想看,如果直接用原始数据做阈值,那白天和晚上的阈值肯定不一样。但分解之后,系统就知道:哦,这个时间点流量高是正常的,只有偏离了“正常波动”才算异常。
4.3 基于百分位数的异常检测
这是我最喜欢的方法。为什么?因为它对极端值不敏感。
举个例子。你监控一个接口的响应时间,采集了 100 个样本:
样本:10ms, 12ms, 11ms, 13ms, 10ms, ..., 5000ms(一个超时请求)
如果用平均值,会被那个 5000ms 拉高。但用 P99(第 99 百分位数),就能排除掉这 1% 的极端值。
具体怎么算?
- 把所有样本从小到大排序
- 取第 99% 位置的值
比如 100 个样本,P99 就是第 99 个值。如果第 99 个值是 200ms,那就说明 99% 的请求都在 200ms 以内。
我建议你这样配置告警:
| 百分位数 | 含义 | 告警阈值建议 |
|---|---|---|
| P50 | 一半请求的体验 | 不直接告警,用于趋势分析 |
| P90 | 大部分用户的体验 | 超过 500ms 告警 |
| P99 | 最差 1% 用户的体验 | 超过 2s 告警(严重) |
| P999 | 极端情况 | 超过 5s 立即告警(P0) |
我曾经用 P99 检测过一个支付接口。平时 P99 在 300ms 左右,突然有一天飙到 2s。查了半天,发现是数据库连接池泄漏。如果只用平均值,可能要到系统崩溃才能发现。
- 对偶发尖刺不敏感,减少误报
- 能反映“大多数用户”的真实体验
- 适合延迟、错误率等非对称分布指标
4.4 三种方法怎么选?一张图说清楚
我画了一张流程图,帮你快速决策:
4.5 避坑指南:我踩过的三个坑
讲完理论,分享几个真实教训:
我曾经给一个新服务配了动态阈值,结果第一天就告警了 50 次。为什么?因为历史数据太少,模型还没收敛。我建议你先跑一周“观察模式”,只记录不告警。
P999 看起来很美好,但数据量不够时,P999 就是那个最大的值。比如你只有 100 个样本,P999 就是第 99.9 个,实际上就是最大值。我建议数据量少于 1000 时,用 P99 就够了。
动态阈值如果只学“白天”的数据,晚上就会误报。我习惯按小时分段训练模型——比如 0-6 点一个模型,6-12 点一个模型。这样准确率高很多。
4.6 小结
阈值设定没有银弹。我的建议是:
- 简单场景:静态阈值 + 人工定期调整
- 周期性业务:动态阈值(时间序列分解)
- 长尾分布:百分位数检测(P99/P999)
- 生产环境:三种方法组合使用,互相兜底
记住一句话:告警规则不是写一次就完事的。你需要持续观察、调整、优化。就像养花一样,得浇水、施肥、修剪。
好了,这一讲就到这里。下一讲我们聊聊告警聚合和降噪——那才是真正让值班同学“睡个好觉”的关键。