4. SLO 计算与窗口:滚动窗口、固定窗口、燃烧速率概念,如何计算 SLO 达成率

SLO 达成率的计算并非简单的“好事件 / 总事件”,其核心在于 时间窗口 与 燃烧速率 的联合控制。本章将拆解三种窗口模型、燃烧速率原理,并给出标准化的达成率计算公式。

4.1 三种窗口模型对比

窗口类型 定义 典型场景 优点 缺点
滚动窗口 以当前时刻为终点,向前取固定时长(如 28 天) 实时监控仪表盘、告警触发 反映最新趋势,对突发敏感 窗口边界频繁滑动,历史数据被快速丢弃
固定窗口 按日历周期(如自然月、自然周)划分 月度/季度汇报、合同 SLA 审计 对齐业务周期,便于报告 月末突发可能被掩盖在整月数据中
复合窗口 同时使用滚动窗口(告警)与固定窗口(报告) 大型 SRE 团队、多级 SLO 体系 兼顾实时性与合规性 需维护两套计算逻辑
实践建议: 生产环境推荐 滚动窗口 作为告警基准,固定窗口 作为对外承诺基准。两者不一致时,以固定窗口为准进行合同结算。

4.2 燃烧速率概念与计算

燃烧速率(Burn Rate)衡量 SLO 错误预算的消耗速度。其核心公式为:

燃烧速率 = 实际错误率 / 允许错误率

其中:

  • 允许错误率 = 1 - SLO 目标(例如 SLO 99.9%,允许错误率 = 0.1%)
  • 实际错误率 = 窗口内错误请求数 / 窗口内总请求数

燃烧速率的意义:

  • 燃烧速率 = 1:消耗速度恰好等于预算生成速度,SLO 刚好达标。
  • 燃烧速率 > 1:消耗过快,若不干预将在窗口结束前耗尽预算。
  • 燃烧速率 < 1:消耗较慢,有剩余预算空间。
告警阈值示例: 若 SLO 为 99.9%(28 天滚动窗口),当燃烧速率连续 1 小时 > 14 时触发紧急告警,表示若持续此速率,2 小时内将耗尽全部预算。

4.3 SLO 达成率计算公式

达成率计算分两步:

  1. 计算窗口内错误预算消耗比例
  2. 转换为达成率
错误预算消耗比例 = (窗口内错误请求数 - 窗口内允许错误数) / 窗口内允许错误数
允许错误数 = 窗口内总请求数 × (1 - SLO 目标)

达成率 = max(0, 1 - 错误预算消耗比例) × 100%

当错误预算消耗比例 ≤ 0 时,达成率为 100%;当消耗比例 ≥ 1 时,达成率为 0%。

4.4 滚动窗口 vs 固定窗口达成率差异

维度 滚动窗口(28 天) 固定窗口(自然月)
窗口长度 固定时长,持续滑动 日历周期,月初重置
错误预算重置 永不重置,持续累积 每月 1 日重置
达成率波动 平滑,受历史影响 月初高,月末可能骤降
适用场景 内部运营、自动化告警 客户 SLA、财务考核

4.5 燃烧速率与达成率的关系图

燃烧速率与 SLO 达成率关系 T0 T28 允许错误率 (0.1%) 正常消耗 (BR<1) 异常消耗 (BR>1) 燃烧速率 (BR) BR = 实际错误率 / 允许错误率 BR=1 → 达成率 100% BR>1 → 达成率下降

4.6 达成率计算示例

假设某服务 SLO 目标为 99.9%,28 天滚动窗口内总请求数为 10,000,000,错误请求数为 15,000:

允许错误率 = 1 - 0.999 = 0.001 (0.1%)
允许错误数 = 10,000,000 × 0.001 = 10,000
实际错误率 = 15,000 / 10,000,000 = 0.0015 (0.15%)
燃烧速率 = 0.0015 / 0.001 = 1.5
错误预算消耗比例 = (15,000 - 10,000) / 10,000 = 0.5
达成率 = max(0, 1 - 0.5) × 100% = 50%
注意: 达成率 50% 意味着已消耗 50% 的错误预算,剩余预算仅够支撑 14 天(按当前速率)。此时应触发告警并启动应急响应。

4.7 多窗口达成率聚合策略

当服务存在多个 SLO(如延迟 SLO、错误率 SLO)时,整体达成率采用 最差原则:

整体达成率 = min(延迟达成率, 错误率达成率, 可用性达成率)

若某个 SLO 达成率低于阈值,整体即判定为不达标。此策略避免单一维度掩盖其他维度的风险。

4.8 窗口选择决策矩阵

业务需求 推荐窗口 燃烧速率告警 达成率报告周期
实时故障发现 滚动窗口(1 小时) BR > 14 每分钟
日常运营监控 滚动窗口(28 天) BR > 2 每小时
客户 SLA 报告 固定窗口(自然月) 不适用 每月
容量规划与预算 固定窗口(季度) 不适用 每季度

4.9 常见误区与避坑

  • 误区一: 达成率 100% 代表服务完美。实际上,达成率 100% 仅表示错误预算未耗尽,仍可能存在少量错误。
  • 误区二: 滚动窗口与固定窗口达成率可直接对比。两者窗口长度和重置机制不同,数值差异正常。
  • 误区三: 燃烧速率只用于告警。燃烧速率还可用于容量规划:若长期 BR > 1,需扩容或优化代码。
  • 误区四: 达成率计算忽略时间衰减。滚动窗口应使用指数加权移动平均(EWMA)而非简单平均,以更敏感地反映近期变化。

4.10 标准化计算流程

  1. 确定窗口类型与长度(滚动/固定,28 天/自然月)
  2. 采集窗口内总请求数与错误请求数
  3. 计算允许错误数 = 总请求数 × (1 - SLO 目标)
  4. 计算错误预算消耗比例 = (实际错误数 - 允许错误数) / 允许错误数
  5. 计算达成率 = max(0, 1 - 消耗比例) × 100%
  6. 计算燃烧速率 = 实际错误率 / 允许错误率
  7. 根据燃烧速率触发告警(如 BR > 2 持续 1 小时)
  8. 记录达成率与燃烧速率至时间序列数据库,用于趋势分析
关键结论: SLO 达成率不是静态数字,而是窗口、燃烧速率、错误预算三者动态博弈的结果。掌握滚动窗口与固定窗口的差异,理解燃烧速率的告警意义,才能将 SLO 从“纸面承诺”转化为“可运营的可靠性工具”。