2. Error Budget 的计算方法:基于 SLI 窗口的公式与示例

Error Budget 的核心思想是:在给定的时间窗口内,服务允许出现一定量的“不可用”或“低质量”状态。这个允许量就是 可用 Error Budget,而实际发生的不可用量就是 已消耗 Budget。当已消耗 Budget 超过可用 Budget 时,SLO 即面临违约风险,此时应触发作业优先级调度策略。

2.1 核心计算要素

计算 Error Budget 需要三个关键输入:

要素 符号 说明
SLO 目标 SLO_target 服务承诺的可用性百分比,如 99.9%
SLI 窗口时长 W 滚动窗口长度,通常为 30 天(即 43200 分钟)
总请求量 Total 窗口内所有有效请求的总数
成功请求量 Good 窗口内满足 SLI 条件的请求数
不良请求量 Bad 窗口内不满足 SLI 条件的请求数(Bad = Total - Good)

2.2 可用 Error Budget 公式

可用 Error Budget 表示在窗口 W 内,服务最多可以容忍的不良请求数量:

可用 Error Budget = Total × (1 - SLO_target)

例如,对于 99.9% 的 SLO,允许的不良比例为 0.1%。若窗口内总请求量为 1,000,000,则:

可用 Error Budget = 1,000,000 × (1 - 0.999) = 1,000,000 × 0.001 = 1,000 个不良请求

2.3 已消耗 Error Budget 公式

已消耗 Error Budget 是窗口内实际发生的不良请求数量:

已消耗 Error Budget = Bad = Total - Good

继续上面的例子,如果窗口内实际不良请求为 400 个:

已消耗 Error Budget = 400

2.4 剩余 Budget 与消耗率

剩余 Budget 和消耗率是调度决策的关键指标:

剩余 Budget = 可用 Error Budget - 已消耗 Error Budget
消耗率 (%) = (已消耗 Error Budget / 可用 Error Budget) × 100%

基于上述示例:

剩余 Budget = 1,000 - 400 = 600
消耗率 = (400 / 1,000) × 100% = 40%
实践要点: 消耗率是触发调度策略的核心阈值。通常设置两个阈值:警告阈值(如 70%)和紧急阈值(如 90%)。当消耗率超过警告阈值时,开始限制低优先级作业;超过紧急阈值时,仅允许关键作业运行。

2.5 30 天滚动窗口计算示例

以下是一个完整的 30 天滚动窗口计算示例,展示每日更新后的 Budget 状态:

日期 当日总请求 当日不良请求 30天累计总请求 30天累计不良请求 可用 Budget 已消耗 Budget 消耗率
第 1 天 33,333 10 33,333 10 33 10 30.3%
第 5 天 35,000 15 170,000 60 170 60 35.3%
第 15 天 32,000 8 500,000 180 500 180 36.0%
第 25 天 34,000 45 840,000 680 840 680 81.0%
第 28 天 33,000 50 940,000 830 940 830 88.3%
第 30 天 35,000 12 1,000,000 900 1,000 900 90.0%
关键观察: 在第 25 天,由于突发大量不良请求(45 个),消耗率从 36% 跃升至 81%,触发了警告阈值。到第 30 天,消耗率达到 90%,触发紧急阈值,此时应严格限制非关键作业的调度。

2.6 Error Budget 滚动窗口计算流程

下图展示了 30 天滚动窗口下 Error Budget 的实时计算与调度决策流程:

Error Budget 滚动窗口计算与调度决策流程 Error Budget 滚动窗口计算与调度决策流程 SLI 数据采集 30天滚动窗口 计算可用 Budget 计算已消耗 Budget 计算消耗率 阈值判断 调度策略输出 消耗率 < 70%:正常调度 70% ≤ 消耗率 < 90%:限制低优 消耗率 ≥ 90%:仅关键作业 说明:每日滚动更新窗口数据,实时计算消耗率,驱动作业优先级调度决策

2.7 多 SLO 场景下的 Budget 聚合

在实际生产环境中,一个服务可能同时维护多个 SLO(如延迟 SLO、错误率 SLO、可用性 SLO)。此时需要聚合计算综合 Error Budget:

综合消耗率 = max(消耗率_latency, 消耗率_error, 消耗率_availability)

调度策略以最差的 SLO 消耗率为准,确保所有 SLO 都不被突破。

重要提醒: 滚动窗口的起始点选择会影响 Budget 的初始状态。建议在服务上线初期使用较短的窗口(如 7 天)进行预热,待数据积累足够后再切换至 30 天窗口。同时,窗口长度应与业务周期对齐,例如电商服务应覆盖完整的促销周期。

2.8 常见计算误区

  • 误区一: 将可用 Budget 视为固定值。实际上,随着窗口滚动,总请求量 Total 每日变化,可用 Budget 也随之动态调整。
  • 误区二: 忽略窗口边界效应。当旧数据滑出窗口时,对应的不良请求会被移除,可能导致消耗率突然下降,需在告警逻辑中增加平滑处理。
  • 误区三: 使用算术平均而非滚动计算。必须严格按 FIFO 原则维护窗口数据,不能简单使用月均值。