1. Error Budget 概念:SLO、SLI 与预算计算

Error Budget(错误预算)是现代站点可靠性工程(SRE)的核心量化工具,它将系统可靠性从“尽力而为”的定性目标转化为可度量、可交易、可触发自动化流程的数值指标。理解 Error Budget 的前提是厘清 SLI 与 SLO 的定义及其数学关系。

1.1 SLI、SLO 与 Error Budget 的定义

术语 全称 定义 示例
SLI Service Level Indicator
(服务等级指标)
对服务质量某一维度的实际测量值,通常是比率或延迟分位数。 请求成功率 = 99.95%
P99 延迟 = 200ms
SLO Service Level Objective
(服务等级目标)
SLI 的目标阈值或范围,是团队承诺的可靠性边界。 月度请求成功率 ≥ 99.9%
P99 延迟 ≤ 300ms
Error Budget 错误预算 SLO 允许的最大不可用时间或失败次数,即 1 − SLO 对应的额度。 SLO = 99.9% → 月度 Error Budget = 0.1% × 总请求量
核心关系:SLI 是“实际值”,SLO 是“目标值”,Error Budget 是“目标允许的偏差总量”。当 SLI 持续低于 SLO 时,Error Budget 被消耗;当 Budget 耗尽(超支),即触发 Runbook 自愈流程。

1.2 Error Budget 计算公式

Error Budget 的计算基于 SLO 定义的窗口期(通常为 30 天滚动窗口)。通用公式如下:

Error Budget = 总事件量 × (1 − SLO)

其中:
- 总事件量 = 窗口期内所有有效请求/操作的总数(或总时间秒数)
- SLO = 以小数表示的目标值(如 99.9% = 0.999)

消耗量 = 总事件量 − 成功事件量
剩余 Budget = Error Budget − 消耗量
Budget 消耗率 = 消耗量 / Error Budget × 100%

示例计算:

  • 月度总请求量 = 10,000,000 次
  • SLO = 99.9%(允许失败率 0.1%)
  • Error Budget = 10,000,000 × 0.001 = 10,000 次失败
  • 当前实际失败次数 = 8,500 → 剩余 Budget = 1,500 次(消耗率 85%)
  • 当前实际失败次数 = 10,500 → Budget 超支,触发自愈流程
实践要点:Error Budget 通常以“时间”或“请求数”为单位。对于延迟类 SLO,建议使用“请求数”计算;对于可用性类 SLO,可使用“分钟数”或“秒数”计算。窗口期推荐使用滚动窗口而非固定日历月,避免月初重置导致风险盲区。

1.3 SLI → SLO → Error Budget 层级关系

SLI → SLO → Error Budget 层级关系 SLI 服务等级指标 实际测量值 SLO 服务等级目标 承诺阈值 Error Budget 错误预算 允许偏差额度 对比 推导 数学关系 Error Budget = 总事件量 × (1 − SLO) SLI ≥ SLO → Budget 未超支(正常状态) SLI < SLO → Budget 消耗 → 超支触发自愈 持续测量 SLI 监控系统采集 计算 Budget 消耗 实时聚合运算 超支判定 触发 Runbook

1.4 多维度 SLO 与 Error Budget 聚合

实际生产环境中,一个服务通常定义多个 SLI 维度(可用性、延迟、吞吐量、错误率),每个维度对应独立的 SLO 和 Error Budget。当任一维度的 Budget 超支时,都应触发自愈流程。

SLI 维度 典型指标 SLO 示例 Error Budget 计算(月)
可用性 请求成功率 ≥ 99.95% 0.05% × 总请求量
延迟(P99) P99 响应时间 ≤ 300ms 超出阈值的请求数 ≤ 1% × 总请求量
错误率 5xx 占比 ≤ 0.1% 0.1% × 总请求量
吞吐量 QPS 达标率 ≥ 目标 QPS 的 95% 5% × 时间窗口
常见误区:不要将多个维度的 Error Budget 合并为一个“总预算”。每个维度独立计算、独立触发。例如:可用性 Budget 未超支但延迟 Budget 已耗尽,同样需要立即执行自愈流程。合并计算会掩盖单一维度的风险。

1.5 Error Budget 的滚动窗口与重置机制

Error Budget 通常采用 滚动时间窗口(Sliding Window)计算,而非固定日历周期。滚动窗口的优势在于:

  • 避免月初重置风险:固定窗口在每月 1 日重置 Budget,可能导致月初大量部署或变更,忽略上月末的残留风险。
  • 持续反映近期状态:滚动窗口始终包含最近 N 天的数据,对突发故障更敏感。
  • 自愈触发更及时:Budget 消耗率持续上升时,滚动窗口能更快达到超支阈值。

常见窗口配置:

窗口类型 窗口长度 适用场景 重置行为
滚动窗口 30 天 / 7 天 生产核心服务 持续滑动,无固定重置点
固定窗口 自然月 非关键内部服务 每月 1 日重置
混合窗口 滚动 7 天 + 固定月 需要快速反馈的服务 双重计算,取较严格者
滚动窗口 vs 固定窗口 Error Budget 对比 固定窗口(自然月) 第1周 第2周 第3周 第4周 每月 1 日 Budget 重置为 100% 滚动窗口(30 天滑动) D1-D7 D8-D14 D15-D21 D22-D30 每天滑动,旧数据移出,新数据移入 关键差异 固定窗口:月初 Budget 充足 → 容易放松警惕 → 月末风险集中 滚动窗口:持续反映近期可靠性 → 触发阈值更稳定 → 自愈响应更及时 推荐生产环境使用滚动窗口,配合 7 天快速窗口做早期预警

1.6 Error Budget 超支阈值与触发条件

在 Runbook 自愈流程设计中,需要定义明确的超支判定条件。通常设置两级阈值:

阈值级别 Budget 消耗率 触发动作 响应时效
预警阈值 ≥ 70% 发送告警通知,启动人工评估 15 分钟内
超支阈值 ≥ 100% 触发 Runbook 自愈流程,自动执行 立即(1 分钟内)
严重超支 ≥ 150% 升级告警,自动回滚或限流 立即(30 秒内)
设计原则:Error Budget 超支触发 Runbook 自愈流程的核心逻辑是“量化 → 监控 → 判定 → 执行”。本章后续内容将详细展开每个环节的工程实现与最佳实践。