想象你家楼下有一家 24 小时营业的“智能咖啡馆”:没有人类服务员,只有一个叫 Agent 的数字服务员。你点一杯咖啡,它会自动下单、询问后厨备货情况、再把咖啡准确送到你手上。但是,顾客凭什么信任一家从没见过的店?答案是:承诺。这家店门口挂着一块招牌——“下单后 30 分钟必达,超时免单”;后厨黑板上还写着另一行字:“我们自己的目标是 25 分钟内出菜”。门口那块顾客看得见的承诺,叫 SLA(服务等级协议);后厨那行只给店员看的内部目标,叫 SLO(服务等级目标)。SLA 让顾客敢下单,SLO 让团队有更严的奔头,而两者之间那 5 分钟的空间,就是“错误预算”——系统允许失误的缓冲地带。本文就用这家咖啡馆的故事,带零基础读者搞懂如何为 AI Agent 系统定义、监控和运营服务质量。

岗位关联

对 AI 从业者来说,掌握 SLA/SLO 等于学会用“顾客听得懂的语言”描述你的系统靠不靠谱;这是从“能跑通”走向“敢承诺”的运维基本功,是 AI 可靠性工程师(Agent SRE)的核心竞争力。

目录
  1. 可视化演示
  2. SLA与SLO——承诺与目标
  3. 核心指标——延迟与可用性
  4. 错误预算——允许失败的空间
  5. 质量监控——后厨的仪表盘
  6. SLA设计——从生意到承诺
  7. 质量运营——持续改进的节奏
  8. Agent运维——让承诺落地
  9. AI 应用场景
  10. Python 演示
  11. 常见误区
  12. 面试题

可视化演示

动态演示Agent SLA/SLO的核心机制,通过基础/核心/应用/扩展四种模式展示关键概念与交互流程。

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

Agent SLA/SLO:SLAS SLA/SLO/SLI概念体系 Agent系统SLO指标设计 核心机制可视化 Agent SLA/SLO整体架构与关键组件

SLA与SLO——承诺与目标

智能咖啡馆门口那块“30 分钟必达”的招牌,是老板写给顾客看的“合同”;后厨黑板上的“25 分钟出菜”,则是写给店员自己看的“目标”。招牌是 SLA(服务等级协议,Service Level Agreement),黑板上那行字就是 SLO(服务等级目标,Service Level Objective)。两者的关系可以这样记:SLA 是“我对外承诺什么”,SLO 是“我对自己要求什么”。SLA 说 30 分钟,SLO 定 25 分钟,中间那 5 分钟不是浪费,而是给系统预留的缓冲带。如果后厨实际出菜平均只要 24 分钟,那 SLA 就非常安全;如果后厨悄悄把目标改成 35 分钟,招牌迟早会被顾客砸掉。

到了 AI Agent 系统里,这套逻辑同样成立。Agent 接过用户的请求后,要经过大模型推理、工具调用、结果生成等多个环节,任何一个环节变慢,用户体感都会下降。因此,团队需要先定义一组 SLO:比如“95% 的请求在 5 秒内完成”“服务可用性不低于 99.5%”。然后把这组 SLO 写进面向客户的 SLA 文件,约定赔偿或者降级条款。SLA 往往写在合同的附页里,SLO 则写在工程师看得见的仪表盘上。

还有一个关键动作:把 SLO 的达成率量化出来。达成率就是一个“及格率”的概念——统计周期里,有多少比例的请求达到了目标。这个数字就像咖啡馆后厨每天记录的“准时出菜率”:如果一个月 10000 单里有 9900 单准时,那准时率就是 99%。达成率是 SLA/SLO 体系的基石,它让“服务质量”从一句口号,变成一个可以被比较、被追踪、被告警的数字。

回到咖啡馆的故事里,SLO 达成率就是后厨的“准时出菜率”。有了这个数字,老板就能在月底总结时拍着胸脯说:“我这个月 99.2% 的订单都按时上了菜。”而对于 AI Agent 团队来说,这个数字还会继续驱动下面的指标设计、错误预算和监控告警。

SLO达成率=N达标N总×100%\text{SLO达成率} = \frac{N_{\text{达标}}}{N_{\text{总}}} \times 100\%
这个公式用“达标数 ÷ 总数”算出及格率。它回答的问题是:我们承诺的质量,到底兑现了多少?
  1. 统计总请求数统计周期内所有进入 Agent 系统的用户请求数量,是整个计算的“分母”,代表全部要考察的服务量。
    N总N_{\text{总}}
  2. 统计达标请求数在 SLO 规定的时间内成功完成、且没有触发错误状态的请求数量,也就是“合格品”的数量。
    N达标N_{\text{达标}}
  3. 求达成率用达标数除以总数,再乘以 100%,得到服务质量的及格率,用来判断这一周期是否“兑现承诺”。
    N达标N总×100%\frac{N_{\text{达标}}}{N_{\text{总}}} \times 100\%

核心指标——延迟与可用性

顾客去咖啡馆最关心两件事:第一,这店到底开不开门(可用性);第二,点了咖啡要等多久(延迟)。在 Agent 服务质量里,延迟和可用性就是最核心的两把尺子。

延迟指的是从用户发出请求到收到响应的时间。但工程师不会只看平均值,而是看“百分位指标”。P50 表示一半请求快于这个值,P95 表示 95% 的请求快于这个值,P99 则几乎把最慢的那批用户也覆盖了。为什么要看长尾?打个比方:咖啡馆平均出菜 15 分钟,听起来不错,可周六晚上有 5% 的顾客等了 40 分钟——这 5% 的顾客正是写差评和投诉最多的人。所以 Agent 的延迟 SLO 通常会写成“P95 延迟低于 1.5 秒”而非“平均延迟低于 1.5 秒”。

可用性的含义更直观:服务在一段时间内正常提供服务的比例。一个 Agent 如果每周维护 1 小时,那它的可用性就是(每周 10080 分钟 − 60 分钟)÷ 10080 分钟,约 99.4%。可用性通常用“几个九”来描述:99.9% 叫“三个九”,一年累计停机不超过 8.76 小时;99.99% 叫“四个九”,一年只有 52.6 分钟的容错空间。每多一个九,系统架构和运维成本都几乎翻倍,所以承诺多少必须精打细算。

咖啡店每周二歇业 30 分钟做卫生,这 30 分钟就是 Tdown;顾客真正能踏进门的时间占比,就是这家店的可用性。Agent 系统也一样,无论是模型服务重启、还是第三方工具抽风,凡是用户“进不了门”的时间都得算进 Tdown。

A=TupTup+Tdown×100%A = \frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}} \times 100\%
这是可用性公式:把“能用的时间”除以“总时间”,得到服务“开门营业”的比率。
  1. 统计总时长把正常运行时间与故障停机时间相加,得到统计窗口内的总时长,例如 30 天总共有 2592000 秒。
    Tup+TdownT_{\text{up}} + T_{\text{down}}
  2. 统计正常运行时长记录服务能够正常对外提供功能的累计时间,这是可用性的“有效分子”。
    TupT_{\text{up}}
  3. 求可用性比例用正常运行时长除以总时长,再乘以 100%,得到服务“开门营业”的比例。
    TupTup+Tdown×100%\frac{T_{\text{up}}}{T_{\text{up}} + T_{\text{down}}} \times 100\%

错误预算——允许失败的空间

如果一家咖啡馆承诺 100% 准时,它就必须为任何意外准备无限多的人手和备料,成本高到离谱。聪明的老板会算一笔账:只要顾客能接受 2% 的订单稍微晚一点,那这 2% 就是“可以犯错的额度”——这就是错误预算(Error Budget)。

错误预算的计算非常简单:用 1 减去 SLO,再乘上统计窗口总时长。假设你给 Agent 定了 99.9% 的可用性 SLO,一个 30 天的窗口(2592000 秒)里,错误预算就是 2592000 × 0.1% ≈ 2592 秒,也就是大约 43 分钟。这 43 分钟是系统“允许”不达标的时间总和。它不是用来鼓励出错的,而是让你明白:只要故障消耗控制在 43 分钟内,这个月的服务质量就算达标。

错误预算最有魅力的地方,是把“要不要发布新版本”变成了一个理直气壮的决策标准:预算充足,就能大胆上线新功能;预算快烧完了,就冻结发布、优先修稳定性。这就像咖啡馆老板会看“本月迟到额度还剩多少”来决定要不要上新菜单——如果这周已经晚送了 15 分钟,那周末的地推活动就得缓一缓。错误预算把“可靠性”从技术问题变成了经营节奏问题。

这个过程就像老板给后厨发“迟到额度卡”:30 天总共只允许 43 分钟的上菜延迟。今天拖了 10 分钟,明天慢了 5 分钟,顾客虽然不一定察觉,但额度卡上的数字在一天天变薄——当它逼近 0,就是全店拉响警报的时候。

Berror=Twindow×(1−SLO)B_{\text{error}} = T_{\text{window}} \times (1 - SLO)
错误预算公式:用总时间乘上“允许不达标”的比例,得到一段可以“挥霍”的故障时间额度。
  1. 确定统计窗口时长选取一个固定的时间窗口,如 30 天,计算其总秒数,作为预算的“钱包容量”。
    TwindowT_{\text{window}}
  2. 取出不可用比例用 1 减去 SLO,得到允许不达标的故障占比,这是整个预算的核心比例。
    1−SLO1 - SLO
  3. 相乘得到错误预算把总时长与故障占比相乘,得出这段窗口内系统总共可以承受的故障秒数。
    Twindow×(1−SLO)T_{\text{window}} \times (1 - SLO)

质量监控——后厨的仪表盘

咖啡馆后厨要随时知道每张订单做到哪一步了,才能保证承诺不变成空话。质量监控就是给 Agent 系统装上的“后厨仪表盘”,它由四个部分组成:指标采集、日志追踪、阈值告警和可视化大盘。

指标采集(Metrics)负责定时记录系统状态——比如每秒处理的请求数、P95 延迟、错误率。日志追踪(Logs & Traces)则记录每一次请求的完整故事:用户说了什么、Agent 调用了哪个工具、大模型返回了什么。出错时,靠日志还原现场;变慢时,靠链路追踪定位瓶颈。阈值告警(Alerting)则是仪表盘上的“报警铃”:当错误预算消耗超过 70%、P95 延迟连续 5 分钟越线,就自动通知值班工程师。最后,这些数据汇总到可视化大盘(Dashboard),让团队一屏看清当前服务质量。

监控的意义不只是“看见了才修”,而是把错误预算的消耗变成连续、自动化的信号。例如,某 AI 客服 Agent 有“P95 响应 2 秒内”的 SLO。某天外部知识库 API 波动,P95 飙到 3.2 秒,监控立刻算出当天预算消耗比平时多 4 倍,并触发告警。工程师顺着 Trace 定位到第三方接口,快速启用备用检索通道,预算消耗在 15 分钟内回归正常。这个“发现—定位—止损”的闭环,就是质量监控的核心价值。

这就像后厨打翻了一锅汤:打翻一次(差值)虽然只影响一两桌,但如果连着打翻五次(累计),今天的“迟到额度卡”就见底了。质量监控要做的,就是在打翻第三次时就拉响后厨的报警铃。

Cbudget=∑i=1n(SLO−Ai)×tiC_{\text{budget}} = \sum_{i=1}^{n} (SLO - A_i) \times t_i
错误预算消耗公式:把每一次故障的“不达标缺口”乘上故障时长,再累计起来,算出钱包掉了多少钱。
  1. 记录每次事故的实际可用性每次故障发生时,记录该段时间内实际达到的可用性水平,记为 A。
    AiA_i
  2. 计算与 SLO 的缺口用 SLO 减去实际可用性,得到这次事故“不合格”的程度。
    SLO−AiSLO - A_i
  3. 折算成预算消耗把缺口乘上故障持续时长,得到这次事故消耗的错误预算。
    (SLO−Ai)×ti(SLO - A_i) \times t_i
  4. 累计所有事故消耗把窗口内所有 n 次事故的消耗加总,得出总消耗量。
    ∑i=1n(SLO−Ai)×ti\sum_{i=1}^{n} (SLO - A_i) \times t_i

SLA设计——从生意到承诺

一块写着“30 分钟必达”的招牌,不是老板拍脑袋决定出来的,而是从顾客容忍度、出餐速度、成本预算里倒推出来的。设计 SLA 的第一原则是:业务对齐。你要先想清楚,用户使用 Agent 完成什么核心任务?是查天气、写代码,还是做金融风控?不同的业务,用户等待耐心完全不同。对用户来说,“回复快”比“架构完美”更重要;对老板来说,“赔偿成本”比“口号响亮”更现实。

第二条原则是可量化。SLA 里不能写“响应尽量快”“服务基本稳定”,必须写成“P95 延迟小于 2 秒”“月度可用性不低于 99.9%”。只有可测量的承诺,才能被监控、被验证、被追责。第三条原则是分层目标:给免费用户和 VIP 用户设计不同等级的 SLO,让高优先级用户享受更快的通道,同时降低普通用户的资源占用。

设计完以后,还要建立评审机制。业务在变,模型在变,SLA 也不能永远不变。团队应每季度回顾一次:我们的 SLO 是不是太松了,导致用户察觉服务质量下滑?SLO 是不是太紧了,团队为了达标而不愿上线新功能?把 SLA 当成“活契约”,而不是挂在墙上的锦旗。

咖啡馆门口挂“30 分钟必达”,但后厨按“25 分钟”给自己施压,那 5 分钟就是 δ。如果某天后厨进了新设备、出菜更快,老板甚至会把招牌改成“25 分钟必达”——SLA 设计就是一个不断逼近顾客期望上限的动态过程。

SLO内部=SLA对外+δSLO_{\text{内部}} = SLA_{\text{对外}} + \delta
内部 SLO 的安全余量公式:对外契约是底线,内部目标要比底线更严格,中间留出差值缓冲。
  1. 确定对外承诺目标SLA 是写在合同里、面向客户的承诺水平,比如“可用性 99.9%”。
    SLA对外SLA_{\text{对外}}
  2. 确定安全余量为了确保对外承诺不会轻易被击穿,内部 SLO 往往会比 SLA 更严格,这个差值就是安全余量。
    δ\delta
  3. 相加得到内部目标把对外承诺加上安全余量,得到工程师真正需要努力达成的内部目标。
    SLA对外+δSLA_{\text{对外}} + \delta

质量运营——持续改进的节奏

服务质量不是“设好 SLO 就万事大吉”,它像健身,要的是持续运营的节奏。质量运营包含四个动作:持续评估、故障复盘、成本控制、迭代优化。

持续评估是指数据不能躺在监控里睡觉。每天自动汇总 SLO 达成率,每周给团队发一份“服务健康周报”,就像给咖啡馆每位服务员打分。故障复盘则是每次 SLO 被击穿后的“事故原因分析会”:不追究个人责任,而是找到系统漏洞、流程缺口和工具盲区,形成一份可执行的改进清单。成本控制提醒团队:可用性每提高一个“九”,可能要翻倍投入 GPU 和链路冗余。SLO 不是越高越好,而是在商业回报可接受的范围内做到刚刚好。

迭代优化则是把上面这些动作串成闭环:评估发现问题 → 复盘找到根因 → 控制成本寻找性价比方案 → 优化架构与代码 → 再次评估验证效果。这个循环不是线性的,而是像咖啡馆每个季度复盘“菜单是否受欢迎”一样,滚动前进。Agent 系统上线第一版时,SLO 可能只是“别崩”;运行半年后,SLO 已经细化到“特定工具调用的错误率小于 1%”。

这家咖啡馆的这个月健康度从 90% 涨到了 96%,说明改进措施开始见效;下个月又掉回 88%,说明又有新变量混了进来。质量运营就是这样一场没有终点的拔河:一边是变更带来的风险,另一边是监控和复盘带来的免疫力。

R=N达标N统计×100%R = \frac{N_{\text{达标}}}{N_{\text{统计}}} \times 100\%
质量运营中的健康度公式:用达标天数除以统计天数,算出服务在一段周期内“健康运行”的占比。
  1. 确定统计周期天数质量运营通常按 30 天滚动窗口评估,因此统计天数为 30。
    N统计N_{\text{统计}}
  2. 统计达标天数记录该窗口内每天实际可用性达到 SLO 目标的天数,这是健康度的“正向分子”。
    N达标N_{\text{达标}}
  3. 求健康度比率用达标天数除以统计天数,乘以 100%,得到这段周期的服务健康度,用于趋势对比。
    N达标N统计×100%\frac{N_{\text{达标}}}{N_{\text{统计}}} \times 100\%

Agent运维——让承诺落地

通用 SLO 理论讲完了,最后来看看 Agent 的运维有什么特殊性。一个 Agent 请求往往不是“一次简单接口调用”,而是一串长长的任务链:用户提问 → 大模型推理 → 调用搜索工具 → 读取返回结果 → 再推理 → 生成最终答案。这条链上的每一环都可能是延迟和错误的来源。

因此,Agent 运维的第一件事是定义 Agent 特有的 SLO 指标:大模型推理延迟、工具调用延迟、工具调用失败率、上下文窗口占用率、Token 消耗量、最终答案的格式正确率。这些指标加在一起,才能回答“用户体感到底好不好”。链路追踪工具在这里尤其重要,因为如果用户觉得“Agent 卡了”,你得能分清到底是模型推理慢,还是第三方搜索 API 超时。

最后是运维闭环:把指标、追踪、告警、错误预算整合到同一个控制面里。一旦 Agent 的工具调用失败率突破 SLO,系统自动放慢新功能发布、拉起备用模型、或切换备选工具。这样,SLA 就不再是挂在墙上的一句广告语,而是一套真正能让 AI 服务“敢承诺、能兑现、可兜底”的运营体系。

把这套公式放回智能咖啡馆:点单(推理)要时间、后厨备料(工具调用)要时间、端出咖啡(生成)也要时间。顾客不会关心哪一环快,只会在乎从下单到端上桌的总时长。Agent 运维要做的事,就是把这三段时间都变成“可观测、可控制、可承诺”的数字。

TAgent=T推理+T工具+T生成T_{\text{Agent}} = T_{\text{推理}} + T_{\text{工具}} + T_{\text{生成}}
Agent 总耗时公式:一次 Agent 请求的响应时间,等于三段子任务耗时之和。
  1. 统计大模型推理耗时指 Agent 每次调用大模型、生成中间结果所消耗的时间,是任务链的第一大块。
    T推理T_{\text{推理}}
  2. 统计工具调用耗时Agent 调用搜索、代码执行、数据库等外部工具所需的时间,包含网络往返与工具处理时长。
    T工具T_{\text{工具}}
  3. 统计最终生成耗时Agent 根据完整上下文输出最终答复的耗时,决定了用户看到最后一个字的等待时间。
    T生成T_{\text{生成}}
  4. 三项合计为总耗时把推理、工具调用和生成的耗时相加,才能还原用户端感受到的完整响应时长。
    T推理+T工具+T生成T_{\text{推理}} + T_{\text{工具}} + T_{\text{生成}}

AI 应用场景

场景 1:智能客服 Agent 的服务质量监控

阶段:AgentOps 运维监控阶段

解决的问题:传统监控只盯着 CPU、内存等服务器指标,无法回答“为什么用户觉得客服变笨了、变慢了”。AI 客服 Agent 涉及大模型推理和知识库检索,任何一个环节抖动都会直接影响用户体感。

具体案例:某电商平台的客服 Agent 设置了两条 SLO:P95 响应时间小于 2 秒、知识库检索工具调用成功率高于 99%。某次大促期间,知识库接口延迟从 300ms 飙到 1.8 秒,监控系统立刻算出错误预算消耗速度翻了三倍,并自动触发告警。值班工程师通过链路追踪定位到第三方检索服务过载,快速切到备用索引,15 分钟后 P95 回落至 1.2 秒。用户完全无感,差评率保持正常。

场景 2:AI 编程助手 Agent 的分层 SLO 设计

阶段:服务等级协议设计阶段

解决的问题:不同用户对响应速度的期望差异巨大,免费用户能接受 10 秒等待,付费用户可能 3 秒就失去耐心。用同一套 SLO 管理两类用户,不是资源浪费,就是体验崩盘。

具体案例:某 AI 编程助手平台设计了双层 SLO:免费层 P95 延迟 8 秒、付费层 P95 延迟 3 秒。付费层请求通过高优先级队列进入模型服务,免费层则使用共享算力。有了清晰分层,平台既能控制推理成本,又能保证核心付费用户获得稳定体验,SLA 合同上的赔偿条款也终于有了可执行的依据。

场景 3:金融风控 Agent 的错误预算运营

阶段:质量运营与发布决策阶段

解决的问题:风控 Agent 的每一次漏判或超时都可能意味着资金损失,团队既想快速迭代风控策略,又怕新模型上线引发可用性波动。

具体案例:某金融科技公司的风控 Agent 定义了月度可用性 SLO 为 99.95%,错误预算约 21.9 分钟。月底时累计消耗已达 19 分钟,团队决定冻结下周的新提示词发布,转而排查第三方数据源超时问题。月初预算重置后,再用灰度方式逐步放量新策略。这套“预算耗尽即冻结发布”的机制,让风险和创新之间获得了动态平衡。

Python 演示

python38 行
class SloMonitor:    def __init__(self, slo, window_days=30):        self.slo = slo        self.window_days = window_days        self.daily_avail = []     def add_day(self, avail_seconds, total_seconds):        rate = avail_seconds * 1.0 / total_seconds        self.daily_avail.append(rate)        if len(self.daily_avail) > self.window_days:            self.daily_avail.pop(0)     def ok_rate(self):        if not self.daily_avail:            return 0.0        ok = sum(1 for r in self.daily_avail if r >= self.slo)        return ok * 1.0 / len(self.daily_avail)     def budget_left(self):        used = 0.0        for r in self.daily_avail:            if r < self.slo:                used += (self.slo - r) * self.window_days        return max(0.0, 1.0 - used)  def main():    m = SloMonitor(slo=0.995, window_days=30)    mock_days = [(86400, 86400), (86340, 86400), (86280, 86400),                 (86400, 86400), (86000, 86400), (86300, 86400)]    for avail, total in mock_days:        m.add_day(avail, total)    print("SLO达成率: %.2f%%" % (m.ok_rate() * 100))    print("错误预算剩余: %.2f%%" % (m.budget_left() * 100))  if __name__ == "__main__":    main()
目的:这段代码实现了一个简易的 SLO 监控器,输入每日可用秒数,输出 SLO 达成率和错误预算剩余量,是正文中错误预算公式的最小落地版本。
  1. rate = avail_seconds * 1.0 / total_seconds把每天的“可用秒数 ÷ 总秒数”换算成 0 到 1 之间的可用性小数。
  2. ok = sum(1 for r in self.daily_avail if r >= self.slo)统计过去窗口里有多少天的可用性达到了 SLO,这是达成率公式的分子。
  3. used += (self.slo - r) * self.window_days当某天可用性低于 SLO 时,把缺口“放大”到一个窗口长度,折算成错误预算消耗。
  4. return max(0.0, 1.0 - used)用 1 减去消耗量并确保不为负,防止预算变成“负数余额”。
  5. if len(self.daily_avail) > self.window_days: self.daily_avail.pop(0)维护一个滚动窗口,只保留最近 30 天数据,让监控永远反映“当前”状态。

常见误区

误区我刚开始做监控时,把 SLA 和 SLO 看成同一个东西,觉得都是对外承诺。客户合同上写 99.9%,内部监控也按 99.9% 去盯。结果线上稍微抖动一下,告警就疯狂轰炸,团队通宵排查,全是虚惊。

正解SLA 是“对外契约”,SLO 是“内部工程目标”。SLA 写得保守,SLO 定得更严格,中间留出安全缓冲。就像咖啡馆招牌写“30 分钟必达”,后厨目标却是“25 分钟出菜”。只有理解了这层区别,才会知道告警应该挂在 SLO 上,而不是 SLA 上。

为何常见:因为“SLA”这个词传播得更广,给人先入为主的印象,而“SLO”听起来像是 SLA 的简称,导致不少新手把二者混为一谈。

误区写 SLO 时总觉得 99.9% 不够气派,直接定 99.999%,恨不得对外承诺“永远不会坏”。毕竟越高越显得团队能力强,客户也更愿意买单。

正解SLO 越高,成本呈指数级上升。99.99% 的可用性意味着全年最多停机 52.6 分钟,需要引入多活架构、自动故障转移、冗余模型部署,GPU 成本可能翻好几倍。错误预算哲学反而鼓励你把 SLO 设在“够用但不挥霍”的水平,把资源花在用户真正感知得到的地方。

为何常见:生活经验告诉我们“标准越高越好”,但系统可靠性是一门“成本—收益”工程,追求完美不等于追求合理。

误区看监控时只关心“平均响应时间 800ms”,觉得一切正常。某次用户反馈“Agent 卡得不行”,打开大盘却发现平均延迟并没有超标,于是怀疑是用户网络问题。

正解平均值会掩盖最差体验。P95、P99 才是决定用户口碑的“长尾指标”。如果 SLO 写的是“P95 小于 1 秒”,你就要盯 P95 的曲线,而不是平均值。咖啡馆平均出菜 15 分钟,但周六晚 5% 的顾客等了 40 分钟,这 5% 的人才是差评来源。

为何常见:平均数是日常生活中最常用的统计口径,大家习惯性地以为“平均还行”就等于“大家都还行”。

误区我以为错误预算就是月底才看一眼的汇总数据。月末发现预算已经耗尽,这才急急忙忙通宵排查,一查发现故障早在一周前就发生了,只是没人意识到它在消耗预算。

正解错误预算应该作为“发布门禁”实时运转:预算健康时鼓励快速迭代,预算消耗达到 70% 时提前告警,预算耗尽时冻结发布。它不是月末的记账本,而是日常的“车速表”。等油箱见底再找加油站,就已经晚了。

为何常见:因为错误预算这个名字带着“财务报表”的味道,容易被当成周期性回顾工具,而不是实时控制系统。

误区为了让自己“心里踏实”,我把 GPU 温度、磁盘 IO、内存占用、模型层数、上下文 token 数全接进监控,大盘密密麻麻上百条曲线。结果一告警,根本不知道先看哪条。

正解监控必须围绕 SLO 做精简,只保留与用户体感强相关的指标。正确的做法是建立“用户请求 → Agent 链路 → 基础资源”的指标树,每一层只挑选能解释 SLO 变化的关键信号。指标是情报不是库存,信息过载等于没有信息。

为何常见:直觉上“全面 = 安全”,但在高噪声的分布式系统里,信号与噪声的比值才是真正决定运维效率的东西。

面试题

Q1. 关于 SLA 与 SLO 的关系,正确的理解是:

单选题 · easy

  • A.SLA 是对外承诺的合同← 正确答案
  • B.SLA 是内部工程目标
  • C.SLO 是对外签署的契约
  • D.SLO 和 SLA 毫无关联

答案:A。SLA 是面向客户的服务协议,属于“合同语言”;SLO 是面向工程团队的内部目标,属于“工程语言”。好比咖啡馆门口招牌与后厨黑板,一个对外、一个对内。选项 B、C 把内外关系完全颠倒了,D 则忽略了二者之间的承接关系。

Q2. 某 Agent 服务可用性为 99.9%,按一个自然月(30 天)计算,最多可停机约多少分钟?

单选题 · easy

  • A.约 4 分钟
  • B.约 43 分钟← 正确答案
  • C.约 72 分钟
  • D.约 430 分钟

答案:B。30 天共 43200 分钟,43200 ×(1 − 0.999)= 43.2 分钟,因此最多可停机约 43 分钟,即 1 − SLO 再乘以窗口总时长,完全对应错误预算公式。

Q3. 错误预算的本质是什么?

单选题 · easy

  • A.允许失败的时间额度← 正确答案
  • B.可完全消除系统故障
  • C.替代数据备份方案
  • D.降低监控采样的频率

答案:A。错误预算 = 总时间 ×(1 − SLO),它量化了“可以犯错而不违反承诺”的空间。它不是用来消灭故障的,也不是备份或采样策略,而是帮助团队决策“何时该发布、何时该止损”。

Q4. “P95 延迟为 500ms”的正确含义是:

单选题 · mid

  • A.有 95% 请求耗时小于 500ms← 正确答案
  • B.有 95% 请求耗时大于 500ms
  • C.平均响应时延正好等于 500ms
  • D.只有 5% 请求耗时为 500ms

答案:A。P95 是百分位指标,表示按延迟排序后第 95 个百分位的值,即 95% 的请求比它快、5% 的请求比它慢。这正是为了捕捉“平均延迟”掩盖下的长尾慢请求。

Q5. 错误预算快耗尽时,最合理的处理方式是:

单选题 · mid

  • A.暂停新版本发布← 正确答案
  • B.删除全部历史日志
  • C.把 SLO 下调一级
  • D.立即给客服加人手

答案:A。错误预算的核心用途就是发布决策:预算充足时鼓励上线,预算紧张时冻结发布、聚焦稳定性。删日志、调 SLO、加客服都是回避问题,不是解决可靠性的方案。

Q6. SLO 达成率的计算公式正确的是:

单选题 · mid

  • A.达标请求数除以总请求数← 正确答案
  • B.停机时长除以统计总时长
  • C.故障次数除以服务请求数
  • D.告警次数除以请求次数

答案:A。SLO 达成率 = 达标数 ÷ 总数 × 100%,衡量的是“及格请求占比”。B 描述的是故障率,C 和 D 混入了告警和故障次数,与 SLO 达成率的定义不符。

Q7. 为 Agent 系统设计 SLA 时,第一步应该做什么?

单选题 · mid

  • A.梳理用户关键旅程← 正确答案
  • B.配置好全部监控大盘
  • C.采购高性能监控软件
  • D.直接承诺最高可用性

答案:A。SLA 设计的第一原则是业务对齐,必须先搞清楚用户最核心的请求链路和使用模式,才能决定该关注哪些指标、定多高的目标。先买工具或先定目标都是本末倒置。

Q8. Agent 系统需要重点监控的特有指标包括:

多选题 · mid

  • A.工具调用失败率← 正确答案
  • B.上下文窗口占用率← 正确答案
  • C.推理 Token 消耗量← 正确答案
  • D.服务器风扇转速

答案:ABC。Agent 特有的服务质量与工具调用、上下文窗口、Token 消耗紧密相关,这些直接决定任务是否成功、响应是否及时。风扇转速属于底层硬件指标,与“Agent 服务质量”隔了几层,不是首选重点。

Q9. 设计 SLO 时应当遵守的原则包括:

多选题 · hard

  • A.目标必须可量化定义← 正确答案
  • B.目标紧扣核心业务← 正确答案
  • C.目标越高越好越有面子
  • D.定期评审并修订目标← 正确答案

答案:ABD。SLO 必须可量化才能监控和验证,必须与业务对齐才有意义,还必须定期评审来适配业务变化。SLO 不是越高越好,而是要兼顾成本与用户体验,因此 C 错误。

Q10. 当 Agent 服务的 SLO 被连续违反后,正确的运维动作包括:

多选题 · hard

  • A.冻结新功能发布← 正确答案
  • B.快速回滚或扩容止损← 正确答案
  • C.定位根因并复盘优化← 正确答案
  • D.删除监控数据回避问题

答案:ABC。SLO 被击穿说明系统的稳定性“钱包”已经见底,此时应冻结变更、先止损、后复盘,形成一个完整的改进闭环。删除监控数据是典型的反面操作,只会让未来故障更难定位。