人人都能学编程
English 开始学习
专项 · 云与 SRE第 5 课 / 共 5 课免费阅读

SLO 与错误预算 · 云与可靠性

一个服务应该有多可靠?又怎么知道它不够可靠?

课程目录

为什么需要它

「永不宕机」做不到,追求它只会让团队寸步难行。站点可靠性工程(SRE)用一个大家都认可的数字——SLO——来代替它,再把它与 100% 之间的差距变成错误预算:留给发布和试验的空间。预算消耗太快,你就会被叫起来处理;预算充足,你就放心发布。

直觉理解

  • SLI(指标):你测量的东西,等于 好的事件 ÷ 全部事件。比如:300 毫秒内成功响应的请求 ÷ 全部请求。
  • SLO(目标):SLI 在一个时间窗口内要达到的目标。比如:30 天内 99.9%。
  • 错误预算:1 − SLO。30 天 99.9% 允许 0.1% 是坏的:30 × 24 × 60 × 0.001 = 43.2 分钟的完全宕机,或者同样比例的失败请求。

消耗速率(burn rate)表示你花预算的速度:错误率 ÷ (1 − SLO)。速率为 1 时,整个窗口正好把预算花完;速率为 10 时,十分之一的时间就花完了。

Google 的《SRE 工作手册》建议:30 天预算的 2% 在一小时内烧掉时就呼叫值班的人,对应的消耗速率是 0.02 × 720 小时 ÷ 1 小时 = 14.4。烧得慢一些的,就变成工作时间处理的工单。

每多一个 9,预算就小十倍:99.99% 一个月只剩大约 4.3 分钟。

定义

SLI 服务水平指标

Service level indicator: the share of good events, such as successful fast requests ÷ all requests.
服务水平指标:好事件所占的比例,比如成功且快速的请求 ÷ 全部请求。

SLO 服务水平目标

Service level objective: the target for an SLI over a time window, like 99.9% over 30 days.
服务水平目标:SLI 在一段时间窗口内的目标,比如 30 天内 99.9%。

错误预算

1 − SLO: how much failure is acceptable in the window.
1 − SLO:窗口内可以接受多少失败。

消耗速率

Error rate ÷ (1 − SLO). Above 1, the budget runs out before the window ends.
错误率 ÷ (1 − SLO)。大于 1 时,预算会在窗口结束前耗尽。

示例

以分钟计的预算

动手试试

每种 SLO 在 30 天里允许多少宕机时间。

minutes = 30 * 24 * 60
for slo in [0.99, 0.999, 0.9999]:
    budget = (1 - slo) * minutes
    print(f"{slo:.2%}: {budget:.1f} minutes")
输出
99.00%: 432.0 minutes
99.90%: 43.2 minutes
99.99%: 4.3 minutes
逐步执行
  1. L130 天有 43,200 分钟。
  2. L3预算就是允许失手的那部分。
  3. L4每多一个 9,预算就缩小十倍。

消耗速率

动手试试

把当前的错误率和 SLO 允许的比较。

def burn_rate(errors, requests, slo):
    return (errors / requests) / (1 - slo)

print(round(burn_rate(50, 100_000, 0.999), 2))
print(round(burn_rate(1_500, 100_000, 0.999), 2))
输出
0.5
15.0
逐步执行
  1. L2错误率除以允许的错误率。
  2. L4错误率 0.05%,允许 0.1%:半速,没问题。0.5
  3. L5错误率 1.5%:快了 15 倍。超过 14.4:该叫人了。15.0

常见错误

追求 100%

用户自己的网络都比这更常出问题,而每次改动都有风险。SLO 定得比用户的需要高一点就够了,留出空间去改进产品。

测错了东西

CPU 和内存不是用户感受到的东西。要从用户那一侧测量:成功而且快速的响应。

每个错误都报警

为不威胁 SLO 的事情呼叫值班,会让大家学会无视报警。只对快速的消耗速率报警。

小测验

1. SLO 是 30 天 99.5%。错误预算允许多少完全宕机的时间?

  1. A216 分钟
  2. B43.2 分钟
  3. C5 分钟
查看答案

答案:A

0.005 × 43,200 分钟 = 216 分钟,三个半小时多一点。

2. 这段代码会输出什么?

slo = 0.999
errors, requests = 300, 100_000
print(round((errors / requests) / (1 - slo), 1))
  1. A
    3.0
  2. B
    0.3
  3. C
    30.0
查看答案

答案:A

错误率 0.3% ÷ 允许的 0.1% = 3:预算会在窗口的三分之一时间里花完。

动手练习

3 道练习,分三层:先预测程序的输出,再按新需求改程序,最后从零写一个。代码在浏览器里运行,提交马上判题。

  1. 预测输出一个月的请求

    准确写出它打印的内容。

  2. 改需求修好预算

    budget_minutes(slo, days) 应该返回在 days 天里,SLO 允许多少分钟的完全宕机,保留 1 位小数。它现在返回的数字大得离谱。修好它。

  3. 从零写要不要叫人?

    写一个 alert(errors, requests, slo),返回:

    • 消耗速率 大于等于 14.4 → "page"
    • 大于等于 1(但小于 14.4)→ "ticket"
    • 其他情况 → "ok",包括没有任何请求的时候

    消耗速率 = (errors / requests) / (1 - slo)。比较之前把消耗速率四舍五入到 6 位小数,避免浮点数的微小误差。

在互动课里练这一课

打开互动课,这些例子都能直接改、直接运行,练习题提交马上判题。免费开始,不用注册。

互动课按顺序解锁:前面的课还没学,会先带你到课程地图。

本课术语

术语中文英文定义
SRE站点可靠性工程Site reliability engineering: running services with software and agreed reliability targets.
SLO服务水平目标The reliability target, such as 99.9% over 30 days.
Error budget错误预算1 − SLO: the failure you can afford.
Burn rate消耗速率How fast the error budget is being spent.