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 - SLO 目标)
达成率 = max(0, 1 - 错误预算消耗比例) × 100%
当错误预算消耗比例 ≤ 0 时,达成率为 100%;当消耗比例 ≥ 1 时,达成率为 0%。
4.4 滚动窗口 vs 固定窗口达成率差异
| 维度 | 滚动窗口(28 天) | 固定窗口(自然月) |
|---|---|---|
| 窗口长度 | 固定时长,持续滑动 | 日历周期,月初重置 |
| 错误预算重置 | 永不重置,持续累积 | 每月 1 日重置 |
| 达成率波动 | 平滑,受历史影响 | 月初高,月末可能骤降 |
| 适用场景 | 内部运营、自动化告警 | 客户 SLA、财务考核 |
4.5 燃烧速率与达成率的关系图
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 标准化计算流程
- 确定窗口类型与长度(滚动/固定,28 天/自然月)
- 采集窗口内总请求数与错误请求数
- 计算允许错误数 = 总请求数 × (1 - SLO 目标)
- 计算错误预算消耗比例 = (实际错误数 - 允许错误数) / 允许错误数
- 计算达成率 = max(0, 1 - 消耗比例) × 100%
- 计算燃烧速率 = 实际错误率 / 允许错误率
- 根据燃烧速率触发告警(如 BR > 2 持续 1 小时)
- 记录达成率与燃烧速率至时间序列数据库,用于趋势分析
关键结论: SLO 达成率不是静态数字,而是窗口、燃烧速率、错误预算三者动态博弈的结果。掌握滚动窗口与固定窗口的差异,理解燃烧速率的告警意义,才能将 SLO 从“纸面承诺”转化为“可运营的可靠性工具”。