专业书籍精读 · SRE · 第 4 章
Site Reliability Engineering · Ch 4 · Google(Chris Jones, John Wilkes, Niall Murphy, Cody Smith)· 2016
你点外卖、打车、刷视频,心里都有一条线:什么样算「还行」,什么样算「不能忍」。做服务的公司内部也得把这条线说清楚,不然「今天服务好不好」只能靠谁嗓门大。《SRE:Google 运维解密》第 4 章讲的就是:怎么把它变成一个大家都认的数字。
一家外卖店要承诺「送得快」。这句话没法用,得拆成三样东西:拿什么量(从下单到敲门的分钟数)、定到多少(一个月里九成五的单子 30 分钟内送到)、做不到赔什么(超时给券)。这三样在书里叫 SLI、SLO、SLA,最容易被混成一团。区分的窍门很简单:问一句「做不到会怎样」——说得出赔偿的,才是合同。
更麻烦的是第一样:量什么。很多团队后台仪表盘一片绿,用户却在应用商店骂街——因为他们量的是「服务器有没有回话」,用户在乎的是「有没有拿到想要的东西」。Google 公布过一个对照:同一个搜索服务,按「服务器回了个正常应答」算有 99.7% 的好成绩;按「用户 5 秒内真的看到结果」算,只剩八成。
这章把顺序倒过来:先问用户在乎什么,再想办法去量它,而不是先看手上有什么现成数据、再挑个好看的。此外还有两个坑。一是别只看平均:「平均送达 25 分钟」可能是一半人 15 分钟、一半人 35 分钟,真会给差评的那一半被抹平了;该做的是把订单按快慢排队,看最后那一小撮有多惨。二是数字要写全:「九成五的单子 30 分钟内送到」还不够,得说清哪段时间里的九成五、在哪一头计时——骑手点「送达」那一刻,还是你真正开门那一刻。细节不写死,两个部门能各自算出一个「达标」。
承诺 30 分钟、长年 12 分钟就到,听着是好事。可久而久之所有人都按 12 分钟安排生活,谁也不留余量;哪天堵车送了 28 分钟,虽然没违约,一整栋楼的午饭都乱了。Google 内部一个被无数服务依赖的组件就撞上过这事:它太稳,稳到别人默认它「永远不会坏」,谁都不做备用方案。后来的对策很直接——好过头的时候,主动把它停一会儿。代价也说明白:这套东西的成本几乎全在前面,把「用户在乎什么」翻译成一个能测、大家又都服气的数字,通常比后面盯着它难得多。
别一上来就争「定几个 9」。先想清用户到底在乎哪件事,把它变成一个说得清「在哪测、算哪段时间」的数;要盯最难受的那一小撮人而不是平均;然后挑一个少到你敢拿它拍板的目标。做得太差要修,做得太好,也得让人记得你会坏。
想进到具体机制、数字和示意图? → 切到精读版
你以为定 SLO 就是挑「几个 9」,其实那是最后一步、也是最不值钱的一步。功课全在前面:先弄清用户在乎什么,翻译成一个能测的量(SLI),写死在哪测、按多长窗口聚合,再挑一个刚好够用、且你敢在优先级争论里当裁判用的数(SLO)。SLA 是把它写进合同并附上赔付条款——SRE 深度参与前两步,第三步交给业务与法务。指标选错,后面几个 9 都是自欺。
p99):把请求按耗时排队,第 99% 慢的那个值——衡量最难受那批用户有多难受;p50 即中位数。1 − SLO,允许坏掉的额度,可拿去换发布速度(Ch3 详述)。本章紧接 Ch3「拥抱风险」,同属 Part II「原则」。Ch3 论证了可靠性目标必须低于 100% 并给出错误预算,却留下一个空白:那个具体的数怎么定、拿什么量。本章填这个空白。往下,Ch6「监控」讲告警如何由 SLO 驱动。对应现实:任何需要回答「我们的服务算不算好」「这次能不能发」「对外该承诺什么」的团队。
病一:三个词混着用。工程师嘴里的「SLA」多半指内部目标,销售嘴里的是合同条款,面板上写的其实是一条 SLI 曲线——词都对不上,讨论收不了尾。书给的判据只有一句:问「达不到会怎样」——没有明确后果的,几乎肯定是 SLO 而不是 SLA。病二:量错了东西。你量「服务端有没有返回 200」,用户在乎「有没有在能忍的时间内拿到结果」——这两件事平时重合,故障时剧烈分叉。
病三:没有共同裁判量,优先级只能靠嗓门。研发按上线量考核、SRE 按不出事考核,同一件事把两边往反方向拽。书因此立了一条锋利的自检:如果你从来没法靠引用某条 SLO 赢下一次优先级讨论,那条 SLO 大概不值得存在。
不解决会怎样?一个日均 2000 万次调用的结算接口,成功率 SLO 定 99.9% 意味着每天允许失败约 2 万次;定 99.99% 只剩 2000 次,一次三分钟的批量报错就能吃光。只因小数点后多写一位,「这版该不该发」的答案就完全相反——而这个数若没被认真定过,答案就由会议室里级别最高的人给出。
SLI 是量——注意「精心定义」四个字,第 3 小节整节都在解释它。SLO 是线,结构无非 SLI ≤ 目标 或 下界 ≤ SLI ≤ 上界。SLA 是合同:SLO 加上「达不到会怎样」,后果通常是退款或罚金。书还明确了分工:SRE 通常不写 SLA(它紧贴业务与产品决策),但要评估这些 SLO 有多难达到,并负责别让赔付条款被触发。对照:Google 搜索对公众没有 SLA、只有内部 SLO,面向企业售卖的产品线才有。
表 1 · 三个词一刀切开:问「达不到会怎样」
| SLI 指标 | SLO 目标 | SLA 合同 | |
|---|---|---|---|
| 是什么 | 一个可测的量 | 给那个量划的线 | 线 + 违约后果 |
| 例子 | 过去 5 分钟成功请求占比 | 按 28 天滚动 ≥ 99.9% | 低于 99.9% 退当月 10% 账单 |
| 谁拍板 | SRE 与用户共同定义 | SRE 与产品共同定义 | 业务与法务,SRE 只评估风险 |
| 达不到会怎样 | 不适用(它只是个数) | 冻结发布、调优先级;比 SLA 更严 | 赔钱;比 SLO 更松,对外要保守 |
全章最常被跳过的一句忠告:从「容易测的东西」开始,你只会得到一堆没用的 SLO。正确顺序是先弄清用户在乎什么、再想办法逼近它——用户在乎的往往难测,只能找代理量,但「找一个逼近用户感受的代理量」和「在现成指标里挑一个」是两件事。数量上也有讲究:太多没有一条真被盯,太少留下大片盲区,答案是少数几个(表 2)。其中一条边界值得单拎:正确性人人在乎,但它是数据的属性、不是基础设施的属性,通常不由 SRE 兜底。
表 2 · 不同类型的系统,默认该盯哪几个 SLI
| 系统类型 | 核心 SLI | 它在回答的问题 |
|---|---|---|
| 面向用户的服务 | 可用性、延迟、吞吐量 | 能不能回应?花了多久?能扛多少? |
| 存储系统 | 延迟、可用性、持久性 | 读写要多久?想读时读得到吗?数据还在吗? |
| 大数据 / 管线 | 吞吐量、端到端延迟 | 处理了多少?从进料到出结果多久?(必要时给单个阶段也定) |
| 所有系统 | 正确性 | 算得对不对——在乎,但它是数据的属性,通常不归 SRE 兜底 |
先说在哪测。多数指标最自然的采集点在服务端,但书里警告:只在服务端测,会漏掉一整类「伤到用户却不体现在服务端指标上」的问题——页面 JavaScript 卡顿时,后端每个请求都是干净的 200、耗时也漂亮,用户却盯着白屏。这时「页面多久变得可用」才是更好的代理量。
再说聚合,两个陷阱。一是窗口:一个系统偶数秒服务 200 请求/秒、奇数秒服务 0,另一个稳定 100 请求/秒,分钟平均一模一样,但前者的瞬时负载是后者的两倍——窗口一拉长,尖峰就被抹平。二是平均:它掩盖了「绝大多数请求很快、同时有一条长尾慢得多得多」的真相。所以书立了一条原则:大多数指标应当被当成「分布」而不是「平均值」来想。高位百分位(p99、p99.9)给一个可信的最坏值,中位数刻画典型情况;方差越大,典型体验越被长尾左右。书还引了一条结论:人们通常宁要稍慢但稳定的系统,也不要平均更快、抖动却大的。
最后是标准化。书建议把 SLI 定义做成模板:聚合区间(按 1 分钟平均)、聚合范围(一个集群的所有任务)、测量频率(每 10 秒)、算哪些请求(黑盒探针的 HTTP GET)、在哪取数、延迟怎么算(到最后一个字节)。这些琐碎约定决定两个部门能不能对上账——「到第一个字节」和「到最后一个字节」在流式响应里能差一个数量级。
合格的写法把百分位、聚合窗口、测量点一并写死(书里的样板见表 3 末行)。在乎曲线形状就写多条(90% / 1 ms、99% / 10 ms、99.9% / 100 ms);负载分几类就按类分开定:批量客户端看吞吐(95% 的 Set 在 1 s 内),交互客户端看延迟(99% 的小负载 Set 在 10 ms 内)——把不同人群塞进一条 SLO,通常两头都不满意。另有来自 Ch3 的硬约束:要求 SLO 被 100% 满足既不现实也不可取,正确做法是给出错误预算并按天跟踪消耗。
SLO 驱动一个闭环:① 测量 SLI → ② 与 SLO 比、判断要不要动 → ③ 想清楚做什么才能达标 → ④ 去做。书给的例子:发现延迟在涨、按趋势几小时后破线,于是验证「是不是 CPU 打满了」,然后加机器摊负载。没有 SLO,你既不知道该不该动手,也不知道什么时候动手。这正是 Ch6 那条原则的上游——告警该由「SLO 快破了」触发,而不是「某台机器 CPU 到 80%」。
公开 SLO 本身就是在设定预期。第一招留安全边际:内部用一个比对外宣称更严的 SLO,慢性问题在外部可见之前就有空间处理。第二招极其反直觉:别超额交付——用户依赖的是你实际的表现,而不是你宣称的承诺。于是有了本章最有名的故事:Google 的分布式锁服务 Chubby 长年可用性远高于 SLO,好到所有服务方都默认它「永远在」、谁都不写降级路径,它一旦真抖一下就引发一大批不相干的服务同时故障。SRE 的对策是计划内停机:季度实际可用性超出目标时主动停一会儿、把实际表现拉回目标线,逼不合理的依赖尽早暴露,而不是攒到某次真故障时一起爆发。
这章的权衡不在「用哪个技术」,而在线画在哪、写多细、由谁守。
表 3 · 同一条延迟 SLO 的四种写法:从没用到能用
| 写法 | 问题在哪 | 会导致什么 |
|---|---|---|
| 「延迟要低」 | 没有量、没有线 | 永远吵不完,谁也无法判定达标 |
| 「平均延迟 < 100 ms」 | 用了平均值 | 长尾被抹平:平均达标,一批用户仍在等几秒 |
| 「p99 < 100 ms」 | 没写窗口与测量点 | 两个部门各自算出「达标」——按 1 分钟还是 1 天?客户端还是服务端? |
| 「99%(按 1 分钟平均)的 Get 在 100 ms 内完成(所有后端服务器上测)」 | — | 可执行、可争论、可自动告警;必要时再补 p90 / p99.9 约束形状 |
表 4 · 选目标的五条纪律(书中给出),以及违反它的代价
| 纪律 | 书里的理由 | 违反后的典型下场 |
|---|---|---|
| 别照现状定 | 照抄当前表现,等于默认现在的架构就是对的 | 把自己锁死在需要英雄主义才能维持、不大改就改不动的系统上 |
| 保持简单 | 复杂的聚合会掩盖性能变化,也难以推理 | 指标破了没人看得懂为什么,控制回路第 ③ 步卡死 |
| 避免绝对词 | 「无限扩展、永远可用」既不现实也极其昂贵 | 目标从第一天起就是装饰品 |
| SLO 越少越好 | 刚好覆盖关键属性即可,而且你要守得住它 | 几十条没有一条能在优先级会上被引用——那它就不该存在 |
| 允许不完美 | 可随着对系统的了解逐步收紧 | 一上来定死、够不着只能往回放——放宽过的目标再没有公信力 |
定紧还是定松?定紧了:错误预算天天见底,发布冻结从例外变成常态,告警疲劳随之而来,团队最终学会无视告警——比没有 SLO 更糟。定松了:用户已经在打一星,面板还是全绿。折中是先按用户可感知的阈值定一条守得住的线,再把「什么时候收紧、收到多少」写进计划。
在哪测、要不要给 SLA?服务端便宜、全量、定位快但离用户最远;客户端最贴近真实体验,代价是埋点成本与更大噪声——多数团队的答案是混合:主线放在服务端以保证可稳定计量,另设一小组客户端指标校准,两者长期背离就说明主线量错了东西。至于 SLA,受众越广,日后想改动或撤销一条不明智的 SLA 就越难,所以对外务必保守,并把「怎么数」抠死:Google Compute Engine 的 SLA 就把 Downtime 定义为连续一分钟以上的中断,不满一分钟一概不计。
这一章把「可靠性」从形容词变成了一套可交接的工程契约。今天 Prometheus、Grafana、Cloud Monitoring 里的 SLO 对象与错误预算消耗率(burn rate)告警,本质上都是它的产品化——「这次能不能发」的答案,从一场会议变成了一次查询。它也改写了面试的正确答法:被问「你们的 SLO 是多少」,只报一个 99.9% 不及格,合格的回答是一串——指标是什么、在哪层测、按什么窗口聚合、为什么是这个数、破了之后会发生什么。最后一问最见功底:说不出后果,那就还是一条装饰。
200 OK 算可用性 99.7%;按「用户在 5 秒内真的拿到结果」算只剩约 80%(其余 18% 更慢、1% 超时、1% 报错)——验证了「测量点选错,SLO 就是自欺」。AJ Ross & Matt Brown, Google Cloud「CRE life lessons: Available or not?」, 2017 ↗99.9%、内部 99.95%——验证了「安全边际」与「别超额交付」。Google Cloud「SRE fundamentals: SLIs, SLAs and SLOs」, 2018 ↗≥ 99.99%、单实例 ≥ 99.9%,未达标按档退还当月账单的 10% / 25% / 100%,并把 Downtime 定义为连续一分钟以上的中断。Google Compute Engine Service Level Agreement ↗p99.9 也有代价:高位百分位统计噪声大,请求量小的服务上会剧烈抖动、容易假告警。① 功课在「几个 9」之前——先弄清用户在乎什么、翻译成能测的 SLI、写死在哪测和怎么聚合。
② 三个词的判据:问「达不到会怎样」。没有明确后果就是 SLO,有赔付才是 SLA。SRE 定 SLI / SLO,SLA 归业务与法务。
③ 挑指标先问用户、别从「我能量什么」出发,且要少而准。服务型看可用性 / 延迟 / 吞吐,存储多一条持久性,管线看吞吐与端到端延迟;正确性是数据的属性,通常不归 SRE 兜底。
④ 测量点决定真相:只在服务端测会漏掉伤到用户却不体现在服务端的问题(99.7% vs 80%)。
⑤ 聚合两个陷阱:窗口抹平尖峰,平均抹平长尾。把指标当分布看,用百分位。
⑥ 合格的 SLO 长这样:「99%(按 1 分钟平均)的 Get 在 100 ms 内完成(所有后端服务器上测)」;要约束形状就写多条百分位,负载分类就分开定,且不能要求 100%。
⑦ 五条纪律:别照现状定、保持简单、避免绝对词、越少越好、允许不完美;自检——引用它能赢下一次优先级讨论吗?
⑧ SLO 驱动四步回路:测 → 比 → 判断 → 做;告警应由「SLO 快破了」触发。期望管理两招:内部目标严于对外承诺,以及别超额交付——Chubby 太可靠而被当成永不失效,最终靠计划内停机把预期拉回目标线。