解读长尾
延迟存在于曲线上,而非单一数字
平均延迟掩盖了用户的真实体验。真实的服务产生分布:一条显示有多少请求耗时多长的曲线。
曲线上有三个点承载了大部分运行意义:
- p50(中位数):分布的中点。一半的请求比它快,一半比它慢。描述典型体验。
- p99:第 99 百分位。只有 1% 的请求比它慢。描述典型用户的最差体验。
- p99.9:只有 0.1% 的请求比它慢。描述频繁使用服务的高频用户的最差体验。
几何洞察:延迟分布几乎总是有长右尾。曲线在中位数附近迅速上升到峰值,然后向右缓慢下降,通常在远离平均值的位置出现一个小凸起。那个凸起代表最慢的用户:那些写愤怒工单的人。
为什么平均值会误导:一个中位数为 50 毫秒、p99 为 5000 毫秒的服务,其典型体验与尾部体验之间存在 100 倍的差距。算术平均值可能落在 100 毫秒,完全掩盖了灾难。算术平均值是对二维形状的单点投影:形状的几乎所有信息都消失了。
百分位乘法问题:一个触及 10 个后端服务的请求,每个服务的 p99 为 100 毫秒,其 p99 大约为 600 毫秒(而不是 100 毫秒)。慢尾部相乘。这就是为什么 SRE 书籍警告:'当心 N 个中最慢的'。随着 N 的增长,你的尾部延迟会迅速恶化。
尾部延迟数学
服务 A 的请求流程并行扇出到 5 个后端服务并等待所有响应。每个后端的 p99 延迟为 100 毫秒。
作为斜率的预算消耗
在时间上绘制预算
在二维坐标轴(x 轴为时间,y 轴为剩余预算)上绘制的错误预算可一目了然地揭示服务健康状况。消耗曲线的形状所传达的信息相当于十个仪表板逐一传达的信息。
三种参考形状:
- 健康的线性消耗:预算按与经过时间成比例的直线下降。在 28 天窗口的第 14 天,应该剩余一半预算。这是 SLO 目标的可视化体现。
- 快速燃烧:陡峭的向下斜率。表示存在活跃的可靠性问题。如果斜率足够陡,预算将在窗口重置之前耗尽,触发错误预算政策。
- 恢复曲线:平坦或上升的段。服务表现优于其 SLO。剩余预算随时间增长,为冒险发布腾出空间。
燃烧率是消耗线的斜率,经过归一化:燃烧率为 1 表示按时间流逝的速度精确消耗预算(与 SLO 完美对齐)。燃烧率为 10 表示比允许的快 10 倍:按这个速度,整个月预算将在 2.8 天内耗尽。
多窗口多燃烧率告警:Google 的 SRE 工作手册推荐基于组合条件告警,例如'过去 1 小时燃烧率高于 14.4 且过去 5 分钟燃烧率高于 14.4'。几何含义:持续的陡峭斜率,而不仅仅是短暂的尖峰。这种形状滤除瞬时波动,同时捕捉真实的耗尽威胁。
解读燃烧率
你的团队的 SLO 在 28 天内为 99.9%。第 7 天时,你已经使用了 60% 的错误预算。过去 24 小时的当前燃烧率为 8。
服务作为有向图
生产作为 DAG
现代服务以依赖图的形式运行。每个服务是一个节点。从服务 A 到服务 B 的每次调用是从 A 到 B 的有向边。完整图景形成一个有向图(有时是 DAG,有时通过异步重试形成环)。
关键几何属性:
- 出度:节点依赖多少个服务。出度越高意味着上游故障模式越多。一个依赖 12 个后端的服务,只要这 12 个中任何一个故障就会失败。
- 入度(扇入):多少个服务依赖此节点。入度越高意味着此处的单一故障会广泛级联。一个有 30 个依赖服务的数据库,具有最大的爆炸半径。
- 介数中心性:经过节点的最短路径数量。高介数节点是阻塞点。认证服务和核心 API 通常得分很高。
- 强连通分量:形成环的服务组。如果 A 调用 B 且 B 调用 A,则存在环。环使故障恢复复杂化:启动任一服务都需要另一个先工作。
爆炸半径是驱动可靠性投资的几何概念。一次故障的爆炸半径是它影响的依赖服务子图。可靠性工程在具有最大爆炸半径的节点上大量投入。提高整体系统可靠性最便宜的方法,通常是在最高介数节点上添加冗余或优雅降级。
爆炸半径推理
一个消费者服务依赖于:AuthService、UserDB、ProductCatalog、PaymentGateway、RecommendationEngine、EmailService、AnalyticsService。AuthService 还有另外 47 个服务依赖于它。EmailService 还有另外 3 个服务依赖于它。RecommendationEngine 还有另外 2 个服务依赖于它。
仪表板的信息几何
像素是不动产
仪表板是一个面积有限的二维表面。分配给一个信号的每个像素都是没有分配给另一个信号的像素。仪表板设计是一个几何问题:在最小的视觉区域内排列最具决策相关性的信息,同时保留有助于识别的空间关系。
阅读模式:西方读者按 F 形扫描(先左上,然后横向,然后向下)。最重要的信号属于左上。右下得到的关注最少。
格式塔分组:来自同一服务的信号属于同一视觉组。一个服务的延迟、流量、错误和饱和度属于一个 2x2 网格,而不是分散在屏幕上。视觉接近度编码逻辑关系。
颜色编码:红色表示错误,黄色表示饱和,绿色表示健康范围。颜色选择是约定,不是随机。在事件期间反转它们会增加每次扫视的认知负荷。
Y 轴缩放:缩放为 0-100% 的图表即使在流量翻倍时也看起来平静。自动缩放到最近值的图表在正常变化时也看起来令人警觉。两种选择都有合适的用途;选择是几何性的,不是装饰性的。
信息密度:信号太少会让团队对出了什么问题视而不见。信号太多会把信号埋在噪声中。爱德华·塔夫特的数据-墨水比适用:最大化传递信息的墨水与装饰用墨水的比率。简洁的迷你图风格胜过杂乱的小部件。
为第一眼而设计
你的团队正在为一个服务设计单一的主仪表板,该服务在 4 个后端依赖项上有 8 个关键 SLI。仪表板必须在 5 秒内回答凌晨 3 点值班工程师的第一个问题:'有什么东西着火了吗,如果有,在哪里?'
SRE 的几何学:总结
运行生产的形状
你已经走过了 SRE 实践之下的四种几何结构:
- 延迟分布作为长尾曲线,其中百分位点比平均值承载更多真相
- 错误预算锥体,其中消耗的斜率比剩余数字更能揭示服务健康状况
- 服务依赖图,其中爆炸半径和中心性指导可靠性投资
- 仪表板布局作为二维不动产,其中像素分配是一个具有运行后果的几何问题
几何思维是将 SRE 与一般运维工作区分开来的能力。运维工程师读数字。SRE 读形状。形状编码了任何单一数字都无法捕捉的信息:燃烧率的斜率、尾部的肥度、节点的中心性、仪表板面板的格式塔。
SRE 本身的配套课程涵盖了实践。本课程涵盖了它们之下的几何学。它们共同构成了现代可靠性工程的视觉和概念骨架。