4. Error Budget 计算原理:预算窗口期选择、预算消耗速率计算、剩余预算与告警阈值
Error Budget(错误预算)是 SRE 实践中的核心量化工具,它将抽象的可靠性目标转化为可度量的、可操作的“预算”。本章深入剖析 Error Budget 的计算原理,重点讲解预算窗口期的选择策略、消耗速率的计算方法,以及如何基于剩余预算设定有效的告警阈值。
4.1 预算窗口期选择
预算窗口期决定了 Error Budget 的“刷新周期”,即在一个固定时间窗口内,系统允许的最大不可用时间或错误次数。窗口期的选择直接影响预算的敏感度和稳定性。
| 窗口期类型 | 典型时长 | 适用场景 | 优缺点 |
|---|---|---|---|
| 滚动窗口 | 28天 / 30天 | 大多数在线服务、API 网关 | 优点:平滑,避免月度边界效应;缺点:对突发故障反应稍慢 |
| 固定日历窗口 | 自然月 | 财务结算、月度 SLA 报告 | 优点:与业务周期对齐;缺点:月初预算重置,月末可能过度紧张 |
| 短窗口 | 1小时 / 1天 | 实时交易系统、高频告警 | 优点:快速响应;缺点:噪音大,容易触发误告警 |
| 长窗口 | 90天 / 季度 | 低频变更、基础设施平台 | 优点:容忍短期波动;缺点:问题发现滞后 |
推荐实践:对于大多数生产服务,建议使用 28天滚动窗口。它既能消除周末/工作日效应,又能避免月度重置带来的“月初挥霍、月末勒紧”行为。
4.2 预算消耗速率计算
预算消耗速率描述了 Error Budget 被“烧掉”的速度。核心公式如下:
Error Budget 总量 = (1 - SLO) × 总请求数(或总时间)
消耗速率 = 错误事件数(或不可用时间) / 窗口期长度
剩余预算 = Error Budget 总量 - 累计消耗量
剩余预算百分比 = (剩余预算 / Error Budget 总量) × 100%
以可用性 SLO 99.9%(三个9)为例,在 28 天滚动窗口内:
- 总时间:28天 × 24小时 × 60分钟 × 60秒 = 2,419,200 秒
- Error Budget 总量:2,419,200 × (1 - 0.999) = 2,419.2 秒 ≈ 40.32 分钟
- 消耗速率:假设过去 7 天累计不可用时间为 600 秒,则消耗速率 = 600 / (7×86400) ≈ 0.00099 秒/秒
- 剩余预算:2,419.2 - 600 = 1,819.2 秒
关键洞察:消耗速率不是静态的。当系统出现持续故障时,速率会急剧上升;当系统稳定时,速率趋近于零。监控消耗速率的趋势比监控值更有价值。
4.3 剩余预算与告警阈值
剩余预算的告警阈值设计是 Error Budget 策略落地的关键。常见的阈值模型包括:
| 告警级别 | 剩余预算阈值 | 响应动作 | 示例 |
|---|---|---|---|
| 信息 | < 50% | 记录日志,通知 SRE 值班 | 剩余预算 20 分钟(总量 40 分钟) |
| 警告 | < 30% | 创建工单,启动初步排查 | 剩余预算 12 分钟 |
| 严重 | < 10% | 触发 PagerDuty,冻结变更 | 剩余预算 4 分钟 |
| 紧急 | < 5% | 全团队介入,考虑降级或回滚 | 剩余预算 2 分钟 |
避坑指南:不要仅依赖剩余预算的值。当窗口期即将结束时,即使剩余预算很少,也可能因为窗口重置而“安全”。建议同时监控 消耗速率趋势 和 预测耗尽时间。
4.4 Error Budget 计算与告警流程
下图展示了从 SLI 采集到告警触发的完整计算链路:
4.5 多窗口预算消耗速率对比
不同窗口期下,消耗速率的敏感度差异显著。下图对比了 1 小时、1 天和 28 天窗口下的预算消耗曲线:
4.6 实践要点与常见误区
- 预算窗口期不可过短:1小时窗口在流量低谷期可能因少量错误就耗尽预算,导致不必要的告警风暴。
- 消耗速率需考虑季节性:促销日、节假日流量高峰会自然增加错误数,应提前调整阈值或使用动态基线。
- 剩余预算告警应分层:不要只设一个阈值。建议至少设置“警告”(30%)和“严重”(10%)两级,并关联不同的响应流程。
- 避免“预算恐慌”:当剩余预算接近 0% 时,不要盲目回滚所有变更。应结合错误类型(如是否为已知故障、是否影响核心用户)做决策。
核心公式总结:
Error Budget 总量 = (1 - SLO) × 窗口期总请求数(或总时间)
消耗速率 = 累计错误数 / 窗口已过时间
剩余预算百分比 = (总量 - 累计消耗) / 总量 × 100%
告警触发条件:剩余预算百分比 < 阈值(如 10%)且消耗速率持续上升。
Error Budget 总量 = (1 - SLO) × 窗口期总请求数(或总时间)
消耗速率 = 累计错误数 / 窗口已过时间
剩余预算百分比 = (总量 - 累计消耗) / 总量 × 100%
告警触发条件:剩余预算百分比 < 阈值(如 10%)且消耗速率持续上升。