我写在设计文档里的每一份 latency 预算,都悄悄地腐烂在 wiki 的某个角落。唯一坚持下来的那个不聪明——它是一个单一的 p99 数字,钉在一个单一的 endpoint 上,由一个单一的团队拥有,由一个没人能悄悄删掉的单一 dashboard 强制执行。这篇文章是那个为什么在其他所有的都没有时坚持下来的故事。

那些没有坚持的

我加入的每个团队都有一份 latency 预算,某处。通常在一份18个月前的设计文档里,三位所有者之前,标题类似于 Performance SLOs,v2。它通常有:

  • 一张40个 endpoint 的表格,每个都有 p50/p95/p99/p99.9 目标。
  • 每个服务一行”服务级目标”。
  • 一个汇总的”产品级体验”指标。
  • 底部的一个注释说”这些是目标,不是保证。”

每一行都是合理的。没有人可以反对任何一个单独的数字。然而每次我对生产里的实际数字运行查询时,我们悄悄地违反了其中一半——没有告警,没有跟进,没有对话。这份预算是装饰性的。

失败模式不是数字是错的。失败模式是没有人大声地拥有其中任何一个。一个没人负责的数字就是没人的问题。

那个坚持的

在一个特定的平台上——我和一个多小队团队做的那些事件驱动现代化工作之一——我们一直在尝试写那份正式的 SLO 文档。它从没在一个 sprint 里存活下来。最终我们放弃,做了一件感觉小到不可能成功的事。

我们选了一个 endpoint。每个人都有意见的那个——一个实时游戏后端里的加入匹配流程。我们在白板上写了一个数字:p99 < 250ms。 我们在旁边写了一个人的名字。我们创建了一个 dashboard URL。我们把那个 dashboard URL 固定在团队的 Slack 频道里,并把它加入了 on-call 交接模板。

这就是整个预算。一个数字。一个 endpoint。一个所有者。一个 dashboard。

它坚持了三年。我们错过了它,我们恢复了,我们再次违反了,我们再次修复了。数字移动了(先降到180ms,然后在我们加了一个值那个代价的功能后升回220ms)。但它总是在议程上——因为它只有一个,每个人都知道 ping 谁。

更简单的版本为什么赢了

四个原因,按我低估它们的频率排序:

1. 认知负荷。 四十个数字对一台机器来说比你想的少,对人类持续注意力来说比你想的多。一个数字可以贴在某人的笔记本上。四十个数字在一个文件里的一张表格里在一个 wiki 的一个文件夹里。

2. 所有权清晰度。 “平台团队拥有它”不是所有权。它是带着合规层的旁观者效应。“Julia 拥有 join-a-match 上的 p99”意味着 Julia 会被 ping 到。Julia 要么修复它要么明确地交接出去。这个数字有一张脸。

3. 告警配合度。 你可以为一个数字设置一个好的告警。你无法为四十个相关的数字设置一个好的告警——你要么过度触发要么触发不足,而且你要等到传呼机已经成为民俗税才会知道哪种情况。(参见我上一篇关于为什么把传呼机变成民俗税会摧毁你的轮值的文章。)

4. 违反时的社会证明。 当数字违反时,人们认识这个数字。“join-a-match 上的 p99 刚跳到380”是一个人们点头的句子。“Grafana dashboard 第3象限的平台 latency SLO 是黄色的”是一个隐藏的句子。你无法围绕一个隐藏的句子动员起来。

修复了我们会议卫生的那个问题

在我们采用单一数字方法之后,我们在每周例会里保留了一个单一的例行问题:“这个数字是红色、黄色还是绿色?”

  • 绿色: 跳过它。没有状态剧场。
  • 黄色: 所有者说一句他们在做什么。
  • 红色: 我们放弃议程,制定一个计划。

这把每周大约30分钟的”性能状态更新”替换成了一个60秒的检查。它也意味着当事情真的很糟时,我们在一周内就注意到了,而不是一个季度内。

那个数字不是什么

  • 它不是完整的画面。还有几十个你仍然在意的其他指标。它们活在 dashboard 里、告警里、事故复盘里。那个数字是脊梁;其他一切是肌肉。
  • 它不是每个 endpoint 的目标。你90%的 endpoint 不值得一个预算。一个预算维护起来很昂贵——把它给那些对产品真正重要的,然后忘掉其余的,直到它们出现在你的错误日志里。
  • 它不是静态的。你会提高和降低它。两者都没问题。一个从不移动的预算是一个没人在看的预算。

如何开始

如果你现在在考虑写一份正式的性能 SLO 文档:不要。相反,今晚,在你忘记之前:

  1. 选你产品里对用户最可见的单一 endpoint。
  2. 拉取它过去30天的 p99。
  3. 向上取整。那就是你的起始数字。
  4. 在它旁边写一个人的名字。大概是你。
  5. 把 dashboard URL 固定在你团队最常用的频道里。
  6. 把”数字是多少?“加进你的周例会。

这是第一周。第二周,你要么注意到这个数字是错的,要么注意到它还好。不管哪种情况,你现在在拥有它了。那已经比大多数 SLO 文档走得更远了。

炫耀时刻

说个安静的部分:这个方法也让我很快地在别人眼里很厉害。“Mo 把我们的 p99 削减了63%“是我的经理在绩效评审里可以大声说出的标题。“Mo 维护了 SLO 文档”不是。选一个量化的数字,拿下那个量化的改善。你的经理无法为一份文档晋升你。