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 的实时计算与调度决策流程:
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 原则维护窗口数据,不能简单使用月均值。