小李在社区开了家面包店,生意渐渐红火。打烊后,他会翻开账本:今天卖了多少面包、顾客平均排队几分钟、有几炉面包烤糊了、高峰时一小时接待了多少人。接着,他给自己定了个目标——“95%的顾客能在10分钟内买到面包”;而为了接下游乐场的长期供货合同,他还在合同里写上“迟送1次赔500元”。这些看似普通的经营动作,正是可靠性工程的核心:每天记录的指标叫 SLI(服务等级指标),给自己定的目标叫 SLO(服务等级目标),跟客户签的赔偿合同叫 SLA(服务等级协议)。而烤箱上的温度报警器、店门口的智慧屏、每周一的复盘会,则对应着监控告警、仪表盘和定期评审。这篇教程会用面包店的故事,把 SLI/SLO/SLA 的定义与监控完整讲透。

岗位关联

对 AI 从业者而言,SLI/SLO/SLA 是云原生时代基础设施团队沟通可靠性的通用语言。掌握这套“指标—目标—合同”三层建模与监控方法,意味着你不仅能写代码,还能用工程手段让系统可靠性可量化、可告警、可改进,这是 SRE、DevOps、平台工程岗位的核心竞争力。

目录
  1. 可视化演示
  2. SLI指标分类:面包店的每日体检
  3. SLI采集方法:给面包店装上仪表
  4. SLO滚动窗口:老板给自己定的目标
  5. SLA违约建模:与游乐场的供货合同
  6. 监控与告警:烤炉上的报警铃
  7. 仪表盘配置:店门口的智慧屏
  8. 定期评审流程:周一晨会与季度复盘
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

展示延迟流量错误饱和度四大黄金信号、SLO目标与错误预算的滚动窗口消耗、以及SLI到SLO到SLA三层指标契约关系。

本节配有交互动效(进入视口后自动加载,约 3KB)。

四大黄金信号 延迟Latency用P50/P95/P99分位衡量 流量Traffic错误Errors饱和度Saturation Lat·Trf·Err·Sat 四信号直接反映服务质量表现

SLI指标分类:面包店的每日体检

小李打烊后有一个固定习惯:翻开账本,数一数今天烤出了多少面包、卖出了多少、有几炉因为火候太大烤糊了、顾客高峰期平均排了多久的队。这四笔账各有各的意义——卖出的面包代表“能正常买到”,排队时长代表“等待是否可接受”,烤糊的数量代表“做错的比例”,而高峰接待量代表“店面能扛多大客流”。在 SRE 领域,这些数字被统称为 SLI(Service Level Indicator,服务等级指标),它是衡量系统“到底好不好”的第一手证据。

SLI 是可靠性的“体温计”,没有它,一切可靠性讨论都是空谈。在技术系统中,SLI 通常分为四类:可用性,指成功响应占全部请求的比例;延迟,指从发出请求到收到响应的时间;吞吐量,指单位时间内系统能处理的请求数;错误率,指返回错误状态(如 HTTP 5xx)的请求占比。这四个维度并非互相排斥,一个核心服务往往同时追踪多项 SLI,比如一个电商首页既要看可用性、延迟,也要看错误率。

以可用性为例,它的计算方式非常直观:

小李的账本其实就是面包店的 SLI 记录册:卖出数除以烘烤总数是“出杯成功率”,排队平均时长是“延迟指标”,烤糊占比是“错误率”。下次你听到 SRE 说“这个接口的 SLI 掉了”,脑海里浮现的就是小李皱眉看着烤糊面包的样子。

可用性=成功请求数总请求数×100%\displaystyle \text{可用性} = \frac{\text{成功请求数}}{\text{总请求数}} \times 100\%
可用性公式的通俗含义:把一段时间内所有请求当成一筐面包,“正常卖出”的占比越高,可用性越好。
  1. 成功请求数分子表示这段时间内返回正常结果的请求数量。只有服务真正完成了客户期望的“交易”,才算成功。
    成功请求数\displaystyle \text{成功请求数}
  2. 总请求数分母是所有发生过的请求,包括成功和失败的。它代表系统承受的全部压力。
    总请求数\displaystyle \text{总请求数}
  3. 乘以 100%把比值换算成百分比形式,方便与 SLO 目标(如 99.95%)直接比较。
    ×100%\displaystyle \times 100\%

SLI采集方法:给面包店装上仪表

账本靠人写在纸上总有遗漏。小李决定给面包店装一套“自动记录系统”:收银机每扫一单自动记一笔,门口的摄像头统计进店人数,烤炉内置温度芯片记录每一次烘烤曲线。这样一来,数据不再靠人回忆,而是由设备自动产生。技术系统的 SLI 采集也是同样的逻辑——数据必须来源于系统运行时的真实痕迹。

常见的采集方法有三类。客户端埋点是在用户端(App、浏览器)主动打点,记录请求发出、响应返回的时间戳和状态码,它最贴近用户真实体感,但可能受网络环境干扰。服务端日志是服务器在处理请求时输出的访问日志和错误日志,通过日志采集器(如 Filebeat、Fluentd)汇聚到分析平台,可靠且成本低,但缺少端到端的用户视角。链路追踪则是在一次请求穿越多个微服务时,为每个服务打上统一的 Trace ID,把散落各处的调用片段串成一条完整链路,从而定位“延迟到底耗在哪个环节”。

单日 SLI 的汇总公式很简单:

对小李而言,收银机的小票就是“客户端埋点”,摄像头人流是“服务端日志”,而烤炉温度曲线则是“链路追踪”——三者互相对账,才能确认到底是排队慢、出单慢还是烤炉本身的问题。SLI 采集的价值就在于此:数据越全,越能还原真相。

当日SLI=当日成功样本数当日总样本数\displaystyle \text{当日SLI} = \frac{\text{当日成功样本数}}{\text{当日总样本数}}
公式的通俗含义:把一天内所有采集到的样本视为整体,成功样本占的比例就是当天的成绩单。
  1. 当日成功样本数分子是一天内所有被采集到且结果为成功的请求样本量。采样的覆盖面越广,分子越能反映真实体验。
    当日成功样本数\displaystyle \text{当日成功样本数}
  2. 当日总样本数分母是当天采集的全部样本,不管成功与否。只有在分母稳定、样本量充足时,比值才有统计意义。
    当日总样本数\displaystyle \text{当日总样本数}

SLO滚动窗口:老板给自己定的目标

有了账本,小李开始给自己定规矩:过去 30 天里,平均要有 95% 的顾客能在 10 分钟内买到面包。注意“过去 30 天”这个说法——它不是从每月 1 号到 30 号的固定日历月,而是今天往前推 30 天,明天窗口就顺势往前挪一天,始终只盯着最近的 30 天。这种设计叫 滚动窗口(rolling window),在 SRE 中称为 SLO(Service Level Objective,服务等级目标)的核心机制。

SLO 的本质是“给 SLI 定一个可验收的分数线”。一个完整的 SLO 由三部分组成:SLI 指标、目标阈值、统计窗口。例如“过去 30 天(窗口),可用性(指标)≥ 99.95%(阈值)”。与固定窗口相比,滚动窗口的最大优势是它永远反映“最近的系统状态”,不会因为月初的糟糕表现被 30 天后的大好表现长期掩盖,也不会因为一个自然月刚结束就立刻“洗白”。窗口设计通常取 30 天,既平滑了偶发抖动,又不会迟钝到无法感知近期恶化。

SLO 达成率的计算如下:

与 SLO 形影不离的是 错误预算(error budget):错误预算 = 1 − SLO 目标值。SLO 为 95% 时,错误预算是 5%,相当于老板允许自己一个月最多搞砸 5% 的生意。只要实际坏样本比例还在这 5% 以内,团队就可以放心发布新功能;一旦超出,就说明“信用额度”透支了。这就像小李给自己留了 3 次烤糊面包的“免死金牌”,只要没超,就不必过度紧张。

SLO达成率=1−滚动窗口内坏样本数滚动窗口内总样本数\displaystyle \text{SLO达成率} = 1 - \frac{\text{滚动窗口内坏样本数}}{\text{滚动窗口内总样本数}}
公式的通俗含义:先算出“出问题的比例”,再用 1 减去它,剩下的就是“表现合格的占比”。
  1. 滚动窗口内坏样本数分子统计窗口内所有未达标的样本,例如超时的请求、返回错误的响应。这批样本是“扣分项”。
    滚动窗口内坏样本数\displaystyle \text{滚动窗口内坏样本数}
  2. 滚动窗口内总样本数分母是窗口内全部请求样本。窗口每滑动一天,分子分母都会随之更新。
    滚动窗口内总样本数\displaystyle \text{滚动窗口内总样本数}
  3. 用 1 减去比值将坏样本占比转化为好样本占比,得到的就是窗口期内的 SLO 达成率。
    1−⋅⋅\displaystyle 1 - \frac{\cdot}{\cdot}

SLA违约建模:与游乐场的供货合同

面包店越做越大,小李与游乐场签了一份长期供货合同:每天早晨 8 点前送达 500 个面包,如果一周内超过 3 次迟到,每次赔偿 500 元,遇到极端天气等不可抗力免责。这份合同把“目标”上升为“契约”。在 SRE 体系中,它被称作 SLA(Service Level Agreement,服务等级协议):一份具有商业约束力的合同,明确规定服务方必须达到的等级,以及达不到时承担的后果。

SLA 的建模包括三个关键要素。违约条件:什么情况算违约?通常以多个 SLO 作为共同门槛,比如“月度可用性低于 99.9% 或 P95 延迟超过 800ms”。赔偿条款:违约后怎么赔?常见形式是服务时长减免、现金赔偿或积分补偿,赔偿金通常与业务影响挂钩。责任划分:哪些情况不算违约?如客户侧配置错误、不可抗力、计划内维护窗口,这些需要在合同中写明免责条款,避免“背锅”。

SLA 赔偿金额可建模为:

对技术团队来说,SLA 是把“技术指标”翻译成“商业语言”的关键桥梁。每一条赔偿条款背后,都需要 SLO 监控数据作为裁判依据——没有可靠的 SLI 采集和 SLO 统计,合同里的数字就是一纸空文。小李深知:敢签这份合同,是因为店里的账本和温度计让他心里有底。

赔偿金额=∑i=1n(违约次数i×赔偿基数i×严重系数i)\displaystyle \text{赔偿金额} = \sum_{i=1}^{n} \left( \text{违约次数}_i \times \text{赔偿基数}_i \times \text{严重系数}_i \right)
公式的通俗含义:每一类违约各自用“次数 × 单价 × 严重度”算出小计,再把所有类别累加,就是总赔偿额。
  1. 违约次数第 i 类违约在结算周期内发生的次数。次数越多,索赔金额越高。
    违约次数i\displaystyle \text{违约次数}_i
  2. 赔偿基数每次违约对应的基本赔偿额,由合同事先约定,相当于“单价”。
    赔偿基数i\displaystyle \text{赔偿基数}_i
  3. 严重系数不同严重程度的违约乘以不同的权重。例如核心链路中断的系数为 2,边缘功能故障为 0.5。
    ×严重系数i\displaystyle \times \text{严重系数}_i
  4. 对各类别求和将所有违约类别的小计加总,得到最终需赔付的总额。
    ∑i=1n\displaystyle \sum_{i=1}^{n}

监控与告警:烤炉上的报警铃

小李给烤炉装了一个报警铃:温度超过设定上限,铃声立刻响起;烤制时间超过 10 分钟,定时器也会“叮”一声提醒。但他也发现,警报不能太灵敏——偶尔开门散热导致的短暂高温,不值得兴师动众。于是他设了规则:只有温度连续 5 分钟超限才算“真出事了”。这正是监控告警系统的设计哲学。

告警规则是告警系统的核心,它规定“什么情况要响铃”。与直觉相反,好的告警规则绝不追求“有异常就告警”,而是要求同时满足“指标越界”和“持续一定时长”两个条件,才能排除瞬时抖动。分级响应将告警按紧急程度分成 P0(系统不可用,立即拉群,15 分钟内响应)、P1(核心功能受损,30 分钟内响应)、P2(非核心问题,工作时间处理)三级。告警抑制则负责防止告警风暴——当某条告警已经被确认,或上游故障必然导致下游大量告警时,自动屏蔽重复或衍生告警,让信息真正“少而准”。

告警触发判断可表示为:

小李的报警铃把“烤糊风险”控制在可控范围内,而生产系统的告警体系则是 SRE 的神经末梢——它把 SLI 的每一次恶化都及时转化为响应动作。记住:告警不是越多越好,而是“值钱”才好;每一次响铃都应该对应一个明确的、可执行的处理动作。

告警触发=(指标值>阈值)∧(持续时长≥N 分钟)\displaystyle \text{告警触发} = \left( \text{指标值} > \text{阈值} \right) \wedge \left( \text{持续时长} \geq N \ \text{分钟} \right)
公式的通俗含义:只有“数值越界”和“越界够久”两件事同时发生,告警才会响起。
  1. 指标值大于阈值当前 SLI 数值越过设定的危险线,例如可用性跌到 90% 以下。
    指标值>阈值\displaystyle \text{指标值} > \text{阈值}
  2. 持续时长不小于 N 分钟越界不是一闪而过,而是持续了至少 N 分钟,用“坚持”来过滤毛刺。
    持续时长≥N 分钟\displaystyle \text{持续时长} \geq N \ \text{分钟}
  3. 逻辑与(∧)两个条件必须同时满足。这就像报警铃既要“温度高”又要“持续高温”,缺一不可。
    A∧B\displaystyle A \wedge B

仪表盘配置:店门口的智慧屏

小李在店门口挂了一块智慧屏:左边是“今日销量”的大数字,中间是最近 30 天“10 分钟出杯率”的折线图,右下角是烤炉实时温度,一旦哪个数值异常,模块会立刻变成红色并可点击下钻到明细。这块屏幕不仅是给顾客看的,更是让店员在忙乱中一眼掌握全局。在 SRE 领域,这块屏幕就是 仪表盘(dashboard)。

仪表盘配置有三大原则。核心指标优先:首屏必须是决策者最关心的几个大数字——当前 SLO 达成率、错误预算剩余、每秒请求量、错误率,而不是几十个图表堆成“满汉全席”。趋势视图辅助:单个数字没有意义,必须配合时间维度的趋势曲线,例如 30 天滚动 SLO 曲线、延迟分位数变化趋势,让“变好还是变坏”一目了然。故障定位路径:仪表盘不仅是展示台,更是排查入口。点击一个异常指标,能逐级下钻到具体的服务、实例、依赖项,形成“总览 → 下钻 → 根因”的排查链路。

仪表盘上最核心的一个数字是 错误预算剩余量:

小李的智慧屏让“经营状况”变得透明可见,生产环境的仪表盘则让整个技术团队对系统健康拥有共同认知。设计仪表盘时,要克制“什么都想放上去”的冲动——好的仪表盘像驾驶舱,只放对飞行安全至关重要的仪表;其余数据放进二级详情页,需要时才查阅。可视化演示中的绿色柱状图和红色窗口,正是这块屏幕的简化版。

错误预算剩余=1−滚动窗口内错误量滚动窗口内总量\displaystyle \text{错误预算剩余} = 1 - \frac{\text{滚动窗口内错误量}}{\text{滚动窗口内总量}}
公式的通俗含义:错误预算还剩多少,相当于手机话费的剩余流量——用完就得“限速”,收手不要乱发布。
  1. 滚动窗口内错误量统计最近的 SLO 窗口里,所有未达标样本的数量。它代表已经“花掉”的错误额度。
    滚动窗口内错误量\displaystyle \text{滚动窗口内错误量}
  2. 滚动窗口内总量与错误量同口径的总样本数。两者比值即当前窗口的实际错误率。
    滚动窗口内总量\displaystyle \text{滚动窗口内总量}
  3. 用 1 减去比值从 100% 中扣掉已消耗比例,得到剩余的预算占比。剩余为 0 时,仪表盘上的数字会变红告警。
    1−⋅⋅\displaystyle 1 - \frac{\cdot}{\cdot}

定期评审流程:周一晨会与季度复盘

每周一小李都会召集店员开晨会:看一眼智慧屏上的上周数据,讨论“为什么周三排队时间特别长”“周五的烤糊率为什么升高”;每月底再复盘一次,定下个月要不要调整进货量;每季度还会重新评估:顾客对 10 分钟出杯的耐心是否变了?外卖单变多后,是不是该把 SLO 拆成“到店”和“外卖”两条?这套循环,就是 SRE 的 定期评审流程。

周度评审关注“近期风险”:检查错误预算消耗速率是否过快、上周的告警是否有效、有无濒临违约的 SLO,及时采取止损措施。月度复盘关注“趋势与质量”:分析 SLI 走势、告警的准确率和噪音率、线上问题复盘,沉淀改进项。季度调整关注“目标校准”:根据业务变化审视 SLO 目标是否仍需调整、SLI 定义是否要补充、告警阈值是否要优化。SLO 不是刻在石碑上的死数字,而是需要持续管理的活目标。

评审中一个重要分析工具是对比趋势:

小李的周一晨会看起来朴素,但正是这种“数据回顾 → 探讨归因 → 制定行动”的循环,让面包店的服务质量稳步提升。SRE 团队与研发团队共同参与定期评审,用数据说话、用目标对齐,可靠性工程才能从一个人的坚守变成一个组织的肌肉记忆。

SLO环比趋势=本月达成率−上月达成率\displaystyle \text{SLO环比趋势} = \text{本月达成率} - \text{上月达成率}
公式的通俗含义:拿这个月的平均成绩和上个月比,差值就能看出是在进步还是退步。
  1. 本月达成率评估周期内 SLO 达成的平均值。例如本月 30 天的可用性达成率均值。
    本月达成率\displaystyle \text{本月达成率}
  2. 上月达成率作为对比基线的上一个周期均值。环比必须在口径一致的前提下比较。
    上月达成率\displaystyle \text{上月达成率}
  3. 两者相减差值为正说明在改善,为负说明在恶化,为零说明保持稳定。结合业务动作分析归因。
    差值=本月−上月\displaystyle \text{差值} = \text{本月} - \text{上月}

AI 应用场景

场景一:电商大促容量评估

阶段:容量规划与可靠性保障

解决的问题:双十一大促前,基础设施团队需要判断现有集群能否扛住流量峰值。传统做法是凭经验“多备几台机器”,成本高且浪费。通过历史 SLI(延迟、吞吐量、错误率)数据训练流量预测模型,并结合 SLO 错误预算动态评估,团队可以精确计算需要扩容的实例数——在错误预算允许的范围内,大胆缩容省钱;逼近阈值时,果断扩容保命。

具体案例:某头部电商平台在大促前,将核心交易链路的可用性 SLO 设为 99.99%,通过监控过去 7 天滚动窗口的错误预算消耗速率,系统在预售期自动预测出“若不扩容,错误预算将在 18 小时后耗尽”,提前触发扩容流程,最终平稳扛住 10 倍峰值流量。

场景二:微服务全链路监控与故障定位

阶段:可观测性建设

解决的问题:一个请求要经过网关、认证、订单、支付等十几个微服务,传统逐台排查日志的方式平均耗时 40 分钟。通过为每个微服务定义独立的 SLI(可用性、延迟、错误率),并依托链路追踪采集全链路数据,监控系统可以自动比对“哪个服务的 SLI 最先恶化”,将故障定位时间从小时级压缩到分钟级。

具体案例:某出行平台的订单服务在晚高峰出现支付超时,SLI 监控显示支付服务 P95 延迟从 300ms 飙升至 2s,而订单服务自身 SLI 正常。告警系统根据依赖拓扑自动关联,锁定支付服务依赖的第三方支付通道故障,运维团队 5 分钟内切流至备用通道,全程用户无感知。

场景三:多云容灾演练的 SLA 倒推设计

阶段:容灾与应急预案设计

解决的问题:企业与云厂商签订 SLA 时,需要明确 RTO(恢复时间目标)和 RPO(恢复点目标)。如果合同中写了“可用性低于 99.99% 赔偿月度费用的 30%”,则技术团队必须倒推设计:机房级别的故障是否能在 30 分钟内完成切换?数据同步延迟能否控制在 5 分钟以内?SLA 条款成为容灾架构设计的硬约束。

具体案例:某金融科技公司在规划多活容灾时,通过 SLO 监控数据评估“单可用区故障”场景下的可用性损失,发现当前架构只能达到 99.9%,于是推动建设跨可用区双活,当模拟故障演练将可用性提升到 99.99% 后,才正式与客户签署更高等级的 SLA。

Python 演示

python61 行
import randomfrom collections import deque  class SLOMonitor:    """30天滚动窗口SLO监控器"""     def __init__(self, slo_target=0.95, window_days=30):        self.slo_target = slo_target        self.window_days = window_days        self.daily_sli = []        self.window = deque()        self.error_budget = 1.0 - slo_target     def add_daily_sample(self, success, total):        # 计算当日SLI并加入滚动窗口        sli = success / total if total > 0 else 1.0        self.daily_sli.append(sli)        self.window.append(sli)        if len(self.window) > self.window_days:            self.window.popleft()     def check_slo(self):        # 检查当前窗口是否达标        if len(self.window) < self.window_days:            return True, 1.0        achieved = sum(self.window) / len(self.window)        return achieved >= self.slo_target, achieved     def burn_rate(self):        # 计算错误预算消耗速率        if len(self.window) < self.window_days:            return 0.0        error_rate = 1.0 - sum(self.window) / len(self.window)        if self.error_budget <= 0:            return 0.0        return error_rate / self.error_budget  def main():    random.seed(42)    monitor = SLOMonitor(slo_target=0.95)     print("第几天\t当日SLI\t窗口SLO\t燃烧率\t状态")    for day in range(50):        # 前40天正常,第41天起注入故障        if day >= 40:            success = random.randint(80, 92)        else:            success = random.randint(96, 100)        total = 100        monitor.add_daily_sample(success, total)        ok, achieved = monitor.check_slo()        burn = monitor.burn_rate()        status = "达标" if ok else "预算耗尽"        if day >= 29:            print(f"{day + 1:>5}\t{success / 100:.3f}\t{achieved:.3f}\t{burn:.2f}\t{status}")  if __name__ == "__main__":    main()
目的:实现一个 30 天滚动窗口的 SLO 监控器,逐日注入模拟请求数据,实时计算窗口内 SLO 达成率与错误预算燃烧速率,并在最后 10 天模拟故障注入,观察 SLO 从达标走向耗尽的完整过程。
  1. class SLOMonitor定义一个可复用的 SLO 监控类,封装滚动窗口、错误预算、燃烧率三套核心逻辑。
  2. self.window = deque()用双端队列存储窗口内的每日 SLI,新数据进、旧数据自动弹出,天然支持“窗口滑动”。
  3. if len(self.window) > self.window_days: self.window.popleft()队列长度超过 30 天时弹出最旧的一天,实现滚动效果。
  4. achieved = sum(self.window) / len(self.window)将窗口内所有天的 SLI 取平均,作为当前 SLO 达成率。
  5. error_rate = 1.0 - sum(self.window) / len(self.window)窗口期内的实际错误率,它是消耗错误预算的“元凶”。
  6. return error_rate / self.error_budget燃烧率大于 1 表示错误预算消耗速度已经超出预期,需要立即介入。

常见误区

误区把 SLO 设成 99.999% 甚至更高,能显得平台“特别可靠”,让领导满意、客户放心。

正解SLO 越高,错误预算越小,系统能容忍的发布和变更空间就越小。就像小李承诺“100% 的顾客 1 分钟内拿到面包”,意味着稍有排队就要向顾客道歉,员工也会被压得喘不过气。高 SLO 意味着高成本——需要更多冗余、更谨慎的发布流程、更频繁的演练。合理做法是根据业务价值设定“够用就好”的目标,并用错误预算主动留出创新空间。

为何常见:人天性追求“完美”,且对外宣传时高数字更有面子;但很多团队没有意识到 SLO 本质是一个“可达成的平衡点”,而非用于炫耀的装饰。

误区只要盯着“成功率”这一个数字,就能掌握系统的全部健康状况。

正解成功率只是 SLI 的一种维度。一个延迟 10 秒但最终成功的请求,用户体验已经崩塌,可用性数字却依然好看。如同面包店只统计“卖出多少面包”,却不记录排队时间和烤糊数量,经营状况仍然会失控。完备的 SLI 体系通常同时关注可用性、延迟、吞吐量、错误率,并针对不同场景选择最敏感的一组指标。

为何常见:成功率最容易从日志中统计,且与“可用性”的字面语义最接近,初学者容易以偏概全。

误区SLA 和 SLO 都是关于服务质量的承诺,日常沟通中混着用没问题。

正解两者有本质区别:SLO 是技术团队内部设定的目标,SLA 是对客户的法律/商业合同。一个 SLA 可能由多个 SLO 打包组成,且 SLA 的违约阈值通常比 SLO 更宽松(给自己留缓冲),例如内部 SLO 是 99.95%,对外 SLA 只承诺 99.9%。就像小李的晨会目标(SLO)和合同赔付(SLA)是两套标准——对顾客承诺“10 分钟出杯”,但合同里只承诺“早晨 8 点前送达”。

为何常见:两者缩写相似且经常在同一文档中并列出现,加上部分云厂商在售前材料中刻意模糊边界,容易造成混淆。

误区监控指标只要异常就应该产生告警,宁可多响,不可漏报,这样系统才安全。

正解告警过多会导致“告警疲劳”——值班人员收到几十条告警后,真正严重的那条反而被淹没。有效的告警体系应遵循“少而准”原则:只有满足“超阈值 + 持续 N 分钟”且需要人工介入时才告警;同时用分级响应和告警抑制压缩噪音。就像小李的烤炉报警铃如果因为开关门就响个不停,真正着火的警报反而没人理睬了。

为何常见:人们下意识认为“更多监控覆盖 = 更可靠”,却忽略了人的注意力是有限资源;告警系统的设计者往往不是过敏值守的人,缺少同理心。

面试题

Q1. SLI 的全称是?

单选题 · easy

  • A.Service Level Indicator← 正确答案
  • B.System Load Interface
  • C.Service Log Integration
  • D.Software Level Index

答案:A。SLI 即 Service Level Indicator(服务等级指标),是对系统健康度的量化测量,如可用性、延迟、错误率。B 是“系统负载接口”、C 是“服务日志集成”、D 是“软件等级指数”,均为混淆项。

Q2. 以下哪个指标最适合衡量系统可用性?

单选题 · easy

  • A.成功请求数除以总请求数的比例← 正确答案
  • B.每分钟处理的数据总量大小
  • C.服务器内存剩余的比例大小
  • D.每周代码部署的次数多少

答案:A。可用性的标准定义是成功请求数占总请求数的比例,它直接回答“系统正常工作的时间占比”。吞吐量看的是 B,内存是资源指标,部署次数与可用性无直接关系。

Q3. 滚动窗口相比固定日历窗口的核心优势是?

单选题 · mid

  • A.实时反映最近的真实服务水平← 正确答案
  • B.无需任何数据采集即可支撑
  • C.能完全替代日志系统的作用
  • D.自动消除所有网络延迟问题

答案:A。滚动窗口始终以“今天往前推 30 天”为统计区间,每天滑动,永远反映系统当前的真实状态;固定窗口则可能在月初被上月数据绑架,或月末急转直下。B、C、D 与窗口机制无关。

Q4. 当 SLO 目标为 99.9% 时,错误预算是多少?

单选题 · mid

  • A.用 1 减去 99.9% 得到 0.1%← 正确答案
  • B.用 99.9% 除以 100% 得到 99.9%
  • C.用 SLO 减去当月达成率差值
  • D.用总请求减去成功请求数量

答案:A。错误预算 = 1 − SLO 目标值。SLO 为 99.9% 时,错误预算即 0.1%,代表系统一个月内可承受的失败比例。B、C、D 均不是错误预算的定义公式。

Q5. SLA 与 SLO 之间的关系是?

单选题 · hard

  • A.SLA 是商业合同 SLO 是技术目标← 正确答案
  • B.SLA 与 SLO 是同一个概念
  • C.SLA 仅适用于底层硬件设备
  • D.SLO 是面向客户的法律文件

答案:A。SLO 是技术团队内部定义的量化目标,SLA 是对客户具有商业约束力的服务合同,通常由多个 SLO 提炼而成。二者是“内控标准”与“对外契约”的关系,不是同一概念。

Q6. 错误预算燃烧率大于 1 说明什么?

单选题 · hard

  • A.错误预算消耗速度超出预期← 正确答案
  • B.系统完全没有发生任何错误
  • C.错误预算即将到期失效
  • D.告警系统已经自动恢复

答案:A。燃烧率 = 实际错误率 / 错误预算比例。燃烧率大于 1 表示当前错误消耗速度超过了预算设计的速度,按此趋势将提前耗尽预算,必须触发冻结发布、紧急修复。B、C、D 与燃烧率定义不符。

Q7. 某系统 SLO 为 99.9%,30 天窗口已消耗 80% 错误预算,SRE 应优先采取哪项措施?

单选题 · extreme

  • A.暂停高风险发布并评估修复← 正确答案
  • B.调低 SLO 使统计数据重新达标
  • C.关闭监控避免告警继续触发
  • D.隐藏错误率降低用户投诉

答案:A。错误预算消耗 80% 是强烈信号,SRE 应进入“冻结发布、全力修复”的管控模式,避免风险变更进一步恶化指标。B、C、D 都是掩盖问题而非解决问题的做法,违背可靠性工程原则。

Q8. 以下哪些属于典型的 SLI 指标分类?

多选题 · mid

  • A.可用性← 正确答案
  • B.延迟← 正确答案
  • C.吞吐量← 正确答案
  • D.代码行数

答案:ABC。SLI 四大经典分类是可用性(能否成功响应)、延迟(响应快慢)、吞吐量(处理能力)和错误率(失败占比)。代码行数是研发效率指标,不属于服务等级指标。

Q9. 有效的告警规则应具备哪些特征?

多选题 · hard

  • A.触发条件与 SLO 强相关← 正确答案
  • B.有明确的分级响应动作← 正确答案
  • C.任何异常都强制立即告警
  • D.能抑制重复避免告警风暴← 正确答案

答案:ABD。好告警应关联 SLO/错误预算(A),对应明确的分级响应(B),并通过抑制机制消除重复告警(D)。C 是典型的“告警疲劳”来源,任何异常都告警会使真正重要的告警被淹没,因而是错误的。

Q10. 设计 SLO 仪表盘时应重点关注哪些内容?

多选题 · easy

  • A.核心指标大数字展示← 正确答案
  • B.趋势视图反映变化情况← 正确答案
  • C.故障快速定位的路径← 正确答案
  • D.公司 Logo 的大图展示

答案:ABC。仪表盘配置三原则是核心指标大数字(A)、趋势视图(B)、故障定位路径(C)。Logo 或装饰元素毫无信息量,不应占据宝贵的仪表盘空间,D 错误。