老张开了一家“准时面馆”,门口贴着醒目的告示:“30分钟内上齐菜品,超时整桌免单。”这张告示就是SLA——对顾客白纸黑字的承诺。后厨出菜口装了个计时器,每道菜从下单到上桌都记录秒数,这是SLI——衡量服务质量的那把尺子。但老张心里还有一本账:“100桌里至少95桌要在30分钟内上齐”,这是他给厨房定的红线,也就是SLO——团队内部必须守住的目标。三层结构层层咬合:告示决定赔多少钱,尺子决定怎么量,红线决定厨房怎么干。AI服务的运维也一样,只有把“系统好像挺稳定”翻译成可量化、可告警、可问责的工程语言,团队才能真正掌控服务质量。
学会这套三要素方法,你就能从“救火队员”升级为“质量设计师”——用错误预算做发布决策,用燃烧率提前预警,这是AI平台运维与SRE岗位最核心的底层能力。
可视化演示
动态演示SLO/SLI/SLA三要素的核心机制,通过总览/传输/转换/输出四种模式展示关键概念与交互流程。
本节配有交互动效(进入视口后自动加载,约 3KB)。
SLO/SLI/SLA三要素:SLAS SLA/SLO/SLI三者关系 SLA外部承诺与合同约束机制 核心机制可视化 SLO/SLI/SLA三要素整体架构与关键组件
三要素定义
老张的“准时面馆”贴出告示:“30分钟内上齐菜品,超时整桌免单。”这张告示就是SLA——对顾客白纸黑字的承诺。后厨出菜口装了计时器,每道菜从下单到上桌都记录秒数,这是SLI。但老张心里还有一本账:“100桌里至少95桌要在30分钟内上齐”,这是他给厨房定的红线,也就是SLO。三样东西各有分工:SLA管“赔多少”,SLI管“怎么量”,SLO管“底线在哪”。
AI服务上线后,只说“系统好像挺稳定”是不够的。SLA、SLO、SLI三层结构把“稳定”拆成三个可回答的问题:对用户承诺什么?用什么数据衡量?内部要守住的底线是多少?在DevOps语境里,SLA通常写进服务合同,包含可用性百分比(如99.9%)和赔偿说明;SLO是工程团队自己定义的量化目标,例如“过去30天,P99推理延迟不超过200毫秒”;SLI则是真实采集的测量值,比如成功率、延迟分位数。三者构成一条从测量到承诺的链条。
所以面馆真正赚钱的秘诀,不是把告示贴得多响,而是秒表、红线和告示三层咬合。把顾客挡在赔偿之外的,不是嘴上的承诺,而是厨房里那根更紧的红线。
- 测量值SLI是实际观测到的数据,比如“昨天平均上菜时长26分钟”。
- 聚合成目标把测量数据加工成一个可考核的目标值,这个值就是内部红线。
- 对外承诺把内部红线放宽一点,写进合同变成对用户的承诺,中间留出的空间就是缓冲。
SLI选取法则
老张一开始让厨师自己报“感觉上菜挺快”,结果顾客投诉不断。后来他在每张桌上放沙漏,从顾客落座到菜齐,量的是“全程体验”而不是“灶上时间”。选SLI的第一原则就是回到用户视角:用户感知不到GPU利用率,只感知“点了推荐按钮多久出结果”。一个SLI如果用户感受不到变化,它对服务质量就没有发言权。
具体到AI工程,常见SLI有四类。第一类是可服务性:请求总数里成功的比例;第二类是延迟:用P50、P95、P99分位数描述“大多数人多快、最慢的1%多慢”;第三类是吞吐量:单位时间处理多少请求;第四类是事件驱动指标:批处理任务成功率、训练作业是否按时完成。特别注意,延迟必须用分位数而不能用平均值,因为平均延迟会被少数快请求“拉平”,掩盖大量慢请求。
就像沙漏只记“菜齐没齐”这一件事,好SLI只回答一个用户能感知的问题,而不是把一堆系统内部指标搅成一大锅粥。
- 成功请求数分子是用户真正拿到结果的次数,对应面馆里30分钟内上齐的订单。
- 总请求数分母是所有到达的请求,不管成功还是失败都算,相当于一晚上接的所有单子。
- 百分比放大相除后乘以100%,把小数翻译成直观的百分比,方便和SLO目标对照。
SLO制定方法
告示承诺30分钟免单,厨房内部红线定多少?老张的答案是28分钟——比承诺更紧。如果红线也定30分钟,那厨房天天在悬崖边走路,一忙起来必然翻车。定SLO的核心思想就是“从SLA反推,再往回收一点”。
制定SLO通常走四步。第一步,确定统计窗口:是滚动30天、自然月,还是周维度。窗口不同,抖动被吸收的程度就不同。第二步,基于SLI历史数据评估可达基线:面馆要看过去三个月平均上菜时长,而不是拍脑袋。第三步,按SLA反推并留缓冲:外部承诺99.9%可用性,内部SLO通常定99.95%,错误率几乎砍半。第四步,与业务方对齐优先级:有些服务追求极致延迟,有些服务更看重吞吐,SLO不能一刀切。标准的SLO表述长这样:“过去30天,99.9%的请求延迟低于200毫秒”。
SLO就是那根28分钟的线:比30分钟承诺紧,又比“每桌20分钟”的死命令更可达成。它把“诚信”翻译成一串能考核的数字,让厨房知道今天到底干得怎么样。
- 目标值SLO目标通常写成百分比,比如99.9%、95%,表示“达到这个比例就算达标”。
- 用1减去目标值越接近100%,减出来的允许错误率就越小,容错空间越紧张。
- 得到允许错误率这个余数就是团队可以犯错的额度,也决定了告警和发布的松紧程度。
错误预算管理
红线不是用来罚厨师的,而是用来管理“搞砸的额度”。100桌允许5桌超时,这5%就是老张给厨房的容错额度。预算没用完,可以让厨师尝试新菜式、调整流程;预算快烧光了,立刻停止新品研发,全员修流程。这就是错误预算的核心思想:把可靠性风险换算成一张可以消费和补充的“信用卡”。
错误预算的计算非常简单:1减去SLO。SLO=99.9%,月度错误预算大约43.2分钟;SLO=99%,月度预算约432分钟,也就是7.2小时。预算的补充周期通常与统计窗口一致——每个新窗口开始,预算自动回满。但真正有价值的是“消耗速度”,也就是燃烧率:实际错误率除以允许错误率。燃烧率等于1,表示按当前速度正好30天烧完;燃烧率等于14.4,意味着2天就会爆表。团队应该用错误预算做发布决策:预算充足时允许更大胆的发布,预算耗尽时冻结非必要变更。
错误预算让“允许失败”变得可管理:预算没花完,新菜随便试;预算见底,厨房立刻停止研发,全员修流程——这就是用容错额度做发布决策的DevOps智慧。
- 月度总分钟数30天乘以24小时乘以60分钟,得到43200分钟,这是月度统计窗口的总量。
- 乘以允许错误率把总量乘以1减SLO,得到本月可用的错误预算分钟数。
- 观测错误率实际运行中统计到的错误比例,比如1000个请求里有5个失败,就是0.5%。
- 相除得燃烧率观测错误率除以允许错误率,得到消耗速度。大于1说明烧得比预期快,需要警惕。
告警策略设计
老张不可能等打烊才发现今晚超时了30桌。他需要火候警报器:连续几分钟“出菜太慢”就立刻喊人。传统监控是等阈值突破才告警,比如“错误率超过5%就报警”,但等这个数字出现,预算往往已经烧掉一大半。Google SRE推荐的“多窗口多燃烧率”告警,用快慢两个窗口同时观察燃烧率,兼顾及时性和准确性。
以月度SLO=99.9%(错误预算0.1%)为例,有三条经典规则:1小时窗口燃烧率≥14.4,说明预算约2天内耗尽,属于紧急告警,需要立刻响应;6小时窗口燃烧率≥6,说明预算约5天内耗尽,属于严重告警;3天窗口燃烧率≥1,说明按当前速度正好30天耗尽,需要开工单跟进。快窗口负责第一时间抓住异常,慢窗口负责过滤偶发抖动,避免误报。这样既不会惊弓之鸟,也不会亡羊补牢。
快慢窗口就像灶台边的两个铃铛:一个一响就扑上去看,一个慢慢摇提醒你今晚整体节奏偏慢。两个铃铛配合,才能既不草木皆兵,也不等到顾客掀桌才反应。
- 统计窗口时长指SLO的统计周期,通常取30天作为基准,单位是“天”。
- 除以燃烧率燃烧率越大,预算消耗越快,剩余时间越短。14.4倍意味着30天除以14.4,约2天。
- 得到耗尽时间输出结果告诉你“按现在的错误速度,还能撑多久”,是决定告警级别的直接依据。
落地实践流程
老张给面馆上了三件套:POS机自动记录每单时间、后厨大屏实时滚动达标率、每周一复盘上周数据。AI工程里的SLO落地同样是这条流水线:从埋点采集,到计算呈现,再到告警决策,缺一不可。
落地包含四个环节。第一,指标采集管道:通过日志、分布式追踪、API网关埋点获取原始数据,AI服务还要额外记录推理耗时、token数等特征。第二,服务端点监控:SLO必须定义在“用户请求的完整生命周期”上,从客户端发起请求到拿到响应,而不是只测某一个内部模块。第三,数据质量控制:处理缺失值、异常时间戳、重复上报,脏数据会直接污染SLO计算,让告警失灵。第四,持续改进:周期性复盘SLO达成情况,与容量规划联动,发现基线漂移就及时调整目标。
没有管道的数据是死数据。面馆的大屏若没人看,和没有大屏没有区别;DevOps的最后一公里,是把SLO数字变成每周例会上的行动项,而不是躺在监控系统里的装饰品。
- 满足条件的观测数分子是达标样本数,比如延迟低于200毫秒的请求数。
- 总观测数分母是窗口内全部样本,包括达标和超标的,保证比例真实。
- 乘以百分比得到达成率,直接和SLO目标比较,判断本周是否守住了红线。
SLA保障体系
免单告示背后,老张设了三道保险:赔偿规则白纸黑字写清楚,后厨目标比告示更严,高峰期多备一口灶。SLA不仅是技术指标,更是商业合同的延伸。一套完整的保障体系要回答三个问题:做不到怎么赔,怎么尽量做到,出了问题谁负责。
落地时通常抓四个方面。第一,赔偿条款设计:按违约时长或次数计算服务额度返还,条款必须和SLO联动,不能只写在销售PPT里。第二,内部SLO支撑:内部红线始终严于外部承诺,留出缓冲垫,避免一次流量尖峰就直接触发赔偿。第三,容量规划联动:错误预算不足时提前扩容、限流或降级非核心功能,用技术手段兜住商业承诺。第四,多方问责机制:on-call轮值、事故复盘、改进项跟踪,确保每一次SLA险情都有人负责闭环。
对外承诺是“面子”,内部SLO是“里子”,容量与问责是“底子”。三子齐备,老张的免单告示才敢贴得理直气壮。AI平台的SLA也同理:只有背后有一套完整的技术保障体系,白纸黑字的承诺才不会变成一纸空文。
- 违约时长统计窗口内未达到SLA的时间长度,比如某月不可用3小时。
- 服务单价客户为单位时间支付的价格,时长乘以单价得到基础费用。
- 赔偿比例根据违约严重程度确定的返还系数,通常与SLA承诺的可用性缺口挂钩。
AI 应用场景
大模型推理服务的SLO守护
阶段:模型部署与在线服务
解决的问题:传统监控只看GPU利用率,用户都投诉“转圈圈”了才发现服务变慢。用P99首字延迟(TTFT)作为SLI,SLO设为200毫秒、99.9%达成率,再用错误预算做发布闸门:预算消耗过半自动暂停实验性发布,预算耗尽触发自动扩容,把服务质量从“事后救火”变成“事前预防”。
具体案例:某MaaS平台为大模型API配置了多窗口多燃烧率告警,凌晨流量高峰时1小时窗口燃烧率超过14.4,系统自动扩容20%实例,成功避免了一次潜在的大规模SLA违约赔偿,整个过程运维人员没有被打扰。
离线训练批处理的错误预算
阶段:模型训练与数据流水线
解决的问题:每天凌晨的批量特征计算和模型训练任务有严格时效,传统做法是失败后人工重跑,经常耽误早上8点的模型上线。现在用“任务成功率”和“完成时间”双SLI定义批处理SLO,预算不足时自动冻结非关键实验任务,保住核心模型按时产出。
具体案例:推荐系统团队用批处理SLO管理数百个训练作业。某天上游数据源异常导致失败率飙升,3天窗口燃烧率超过1触发工单,系统自动降级低优pipeline,核心模型在截止时间前完成训练,次日推荐效果未受影响。
Python 演示
import mathimport random class LatencyRecorder: """记录每次请求的延迟, 并评估SLO与错误预算状态.""" def __init__(self, slo_ratio=0.95, slo_line=30.0): self.slo_ratio = slo_ratio # SLO目标: 达标比例 self.slo_line = slo_line # SLO红线: 最长可接受延迟 self.samples = [] # 存放每单延迟 self.total_count = 0 # 总请求数 self.bad_count = 0 # 超时请求数 def record(self, latency): self.samples.append(latency) self.total_count += 1 if latency > self.slo_line: self.bad_count += 1 def percentile(self, p): ordered = sorted(self.samples) idx = int(math.ceil(p / 100.0 * len(ordered))) - 1 return ordered[max(idx, 0)] def summarize(self): if self.total_count == 0: return {} ok = self.total_count - self.bad_count sli = ok / self.total_count error_rate = self.bad_count / self.total_count allowed_error = 1.0 - self.slo_ratio burn_rate = error_rate / allowed_error if allowed_error else 0.0 return { "total": self.total_count, "sli": sli, "p95": self.percentile(95), "p99": self.percentile(99), "error_rate": error_rate, "burn_rate": burn_rate, "budget_left": max(0.0, 1.0 - burn_rate), } def simulate_diner(): rng = random.Random(42) rec = LatencyRecorder(slo_ratio=0.95, slo_line=30.0) for _ in range(2000): latency = rng.lognormvariate(2.6, 0.55) rec.record(latency) report = rec.summarize() print("总单量:", report["total"]) print("SLI(达标率): {:.2%}".format(report["sli"])) print("P95延迟: {:.1f} 分钟".format(report["p95"])) print("P99延迟: {:.1f} 分钟".format(report["p99"])) print("燃烧率: {:.2f}".format(report["burn_rate"])) if report["burn_rate"] > 1.0: print("错误预算超支, 应冻结发布, 优先修复流程") elif report["burn_rate"] > 0.5: print("燃烧速度偏快, 建议暂停非必要发布") else: print("预算消耗正常, 可继续迭代") if __name__ == "__main__": simulate_diner()
LatencyRecorder(slo_ratio=0.95, slo_line=30.0)创建一个“面馆记录器”:要求95%的订单在30分钟内送达,这两者就是SLO。if latency > self.slo_line: self.bad_count += 1每单延迟超过红线就记一次超时,这是SLI的原始采集。idx = int(math.ceil(p / 100.0 * len(ordered))) - 1把延迟排序后定位第p百分位,用来算P95和P99。error_rate = self.bad_count / self.total_count实际超时率,对应面馆打烊后统计的“搞砸比例”。burn_rate = error_rate / allowed_error实际超时率除以允许超时率得到燃烧率,超过1说明预算亮红灯。
常见误区
误区SLA就是SLO,对外承诺和内部目标是一回事,写一个数值就够了。
正解两者必须分开。SLA是给顾客看的合同,附带赔偿条款;SLO是给团队看的红线,通常比SLA更严格。面馆如果只在门口贴告示、不给厨房定28分钟的目标,那告示迟早变成赔钱通知。正确做法是外部承诺99.9%,内部目标定99.95%,用0.05%的缓冲抵御波动。
为何常见:很多团队从销售那里拿到一个承诺数值,就直接丢给研发当目标,省掉了内部拆解和留缓冲的环节。
误区平均响应时间1秒,系统应该挺健康的,不用告警。
正解平均值是“最骗人”的统计量。100个请求里99个瞬间返回、1个卡了60秒,平均值也才1秒出头,但那1%的用户体验是灾难。应该用P95、P99这类分位数,直接回答“最慢的那批用户到底等多久”。面馆里哪怕99桌都飞快,只要有1桌等了1小时,投诉就来了。
为何常见:平均值计算简单、展示直观,监控面板默认就是平均值,很多人习惯了就不深究。
误区错误预算还有余额就不用管,等耗尽再告警不迟。
正解预算是“存量”,燃烧率才是“流速”。等存量归零再出手,用户已经遭殃很久。Google SRE的实践是在燃烧率达到14.4时紧急告警,因为按这个速度两天就会烧完。面馆不会等月底才发现整月都超时,而是连续几桌慢就立刻冲进厨房。
为何常见:人们天然关注“还剩多少”,而忽略“正在以多快速度消耗”,这是存量思维和流量思维的差别。
误区目标定得越高越好,100%才显得服务质量过硬。
正解100%意味着错误预算为零,团队会为了一点点抖动不敢发布任何变更,最终拖慢迭代。SLO的本质是“在可靠性和创新速度之间找平衡”,通常设99.9%到99.99%之间,留出0.01%到0.1%的错误预算给探索和发布。面馆如果要求每桌必须零超时,厨房只能把所有菜都提前做好,顾客反而吃不上热乎的。
为何常见:管理者习惯把目标当口号,没有意识到SLO是工程决策工具,而不是宣传标语。
误区SLO是年初定好就锁死的指标,不用再调整。
正解SLO需要周期性review。业务目标变了、系统架构升级了、用户规模涨了,旧的目标可能过严或过松。建议每季度复盘一次达成率,结合容量规划调整阈值。老张的面馆从10桌扩到50桌后,厨房流程变了,28分钟的红线也要重新评估才能继续有效。
为何常见:设定目标时花了大力气,容易产生“定了就结束”的心理,忽略了SLO是持续运营的闭环。
面试题
Q1. SLA与SLO的核心区别是什么?
- A.二者完全等价
- B.前者对外后者对内← 正确答案
- C.SLA只是内部指标
- D.SLO是客户合同
答案:B。SLA是对外的合同承诺,包含赔偿条款;SLO是团队内部的量化红线,通常比SLA更严格。面馆里SLA是门口告示,SLO是后厨的28分钟红线,两者不能混用。
Q2. 下列哪个最适合作为AI推理服务的SLI?
- A.GPU平均利用率
- B.P99推理延迟← 正确答案
- C.代码提交频率
- D.团队会议时长
答案:B。SLI必须从用户视角选择,用户感知到的是“请求多久出结果”,所以P99推理延迟最合适。GPU利用率是内部资源指标,代码提交频率和会议时长与服务质量无关。
Q3. SLO设为99.9%时,月度错误预算约为多少分钟?
- A.约43分钟← 正确答案
- B.约432分钟
- C.约4.3分钟
- D.约0.43分钟
答案:A。一个月约43200分钟,乘以允许错误率0.1%,得到43.2分钟。这43分钟就是团队本月可以“搞砸”的总时间,相当于面馆每月允许约43分钟整体超时。
Q4. 燃烧率为14.4时,意味着什么?
- A.预算约2天内耗尽← 正确答案
- B.预算永远不会耗尽
- C.延迟降低十倍
- D.说明系统恢复正常
答案:A。预算耗尽时间等于统计窗口除以燃烧率,30天除以14.4约等于2.08天。燃烧率14.4是紧急告警线,说明按当前错误速度,月度预算两天就烧光了,必须立刻介入。
Q5. 多窗口多燃烧率告警为什么用快慢两个窗口?
- A.快窗抢响应慢窗滤误报← 正确答案
- B.纯粹为了增加告警量
- C.两窗数值必须恒相等
- D.方便生成可视化周报
答案:A。1小时快窗口能第一时间捕捉异常,但容易误报;3天慢窗口更稳定,但响应太慢。两者结合,快窗口负责及时性,慢窗口负责准确性,避免告警疲劳也避免漏报。
Q6. 某服务7天错误率为0.2%,SLO=99.8%,燃烧率是多少?
- A.约为1← 正确答案
- B.约为2
- C.约为14.4
- D.约为0.5
答案:A。允许错误率等于1减99.8%等于0.2%,燃烧率等于观测错误率0.2%除以允许错误率0.2%,结果为1。这说明按当前速度,预算正好在统计窗口耗尽时用完,属于临界状态。
Q7. 错误预算耗尽时,团队应该怎么做?
- A.继续大规模发布
- B.冻结发布专注修可靠性← 正确答案
- C.删除所有监控环节
- D.把SLO提高到100%
答案:B。错误预算耗尽意味着本月的容错空间已经用完,继续发布风险极高。正确做法是冻结非必要变更,集中修复可靠性问题,等到下个窗口预算回满再恢复发布节奏。
Q8. 制定SLO时应该考虑哪些事项?
- A.从SLA反推并留缓冲← 正确答案
- B.参考历史数据评估可达← 正确答案
- C.目标必须设为百分百
- D.与业务方对齐优先级← 正确答案
答案:ABD。SLO制定要反推自SLA并留缓冲,要参考历史数据确认可达性,还要和业务方对齐优先级。设成100%是常见误区,它会抹掉所有容错空间,让团队不敢发布。
Q9. 哪些SLI适合衡量AI推理服务的服务质量?
- A.端到端P99延迟← 正确答案
- B.推理请求成功率← 正确答案
- C.研发人员代码行数
- D.批处理作业完成时效← 正确答案
答案:ABD。在线推理服务关注端到端延迟和请求成功率,离线批处理关注作业完成时效,这些都是用户可感知的质量维度。代码行数衡量的是研发产出,不是服务质量。
Q10. 关于错误预算与发布策略,下列说法正确的是?
- A.预算充足时允许更大胆发布← 正确答案
- B.预算耗尽应冻结发布← 正确答案
- C.任何时候都禁止发布
- D.消耗速率可联动容量规划← 正确答案
答案:ABD。错误预算的本质是用容错额度换创新速度:预算充足就大胆发布,预算耗尽就冻结变更。燃烧率作为消耗速率,还能触发容量规划预警。任何时候都禁止发布等于零错误预算的极端情况,不是健康状态。