2. SLO 与 SLI 基础:服务水平指标(SLI)定义、服务水平目标(SLO)设定原则、常见的 SLI 类型

在构建自愈系统之前,必须建立一套可量化的“健康标尺”。SLI(Service Level Indicator,服务水平指标)是具体的测量值,SLO(Service Level Objective,服务水平目标)是期望的目标区间。两者共同构成 Error Budget 的计算基础。

2.1 服务水平指标(SLI)定义

SLI 是对服务某个特定维度的直接测量,通常表示为一段时间内的比率、分布或计数。一个有效的 SLI 必须满足:

  • 可观测:能从监控系统直接采集,无需人工估算。
  • 可重复:不同观测者在同一时段应得到一致结果。
  • 面向用户:优先测量用户感知到的行为,而非内部组件状态。
定义公式示例:
SLI延迟 = 所有请求中,服务端响应时间 ≤ 200ms 的请求占比
SLI错误率 = 返回 HTTP 5xx 状态码的请求数 ÷ 总请求数

2.2 服务水平目标(SLO)设定原则

SLO 是 SLI 的目标阈值或范围,设定时需遵循以下原则:

原则 说明 反例
用户边界对齐 SLO 应反映用户可容忍的降级程度,而非系统极限 内部 P99 延迟 50ms,但用户端因网络抖动实际感知 500ms
可达成性 目标不应追求 100%,需预留合理的 Error Budget 设定 99.999% 可用性,但基础设施仅支持 99.9%
时间窗口明确 必须指定评估周期(如 30 天滚动窗口) “全年可用性 99.9%” 无法用于日常运维决策
可测量性 SLI 必须能精确计算,避免模糊描述 “大部分请求应该很快”
黄金法则:SLO 越严格,Error Budget 越少,系统变更速度越慢。建议从“比用户期望略好一点”开始,逐步收紧。

2.3 常见的 SLI 类型

生产环境中,以下三类 SLI 覆盖了绝大多数服务健康评估场景:

2.3.1 延迟(Latency)

衡量请求从发出到收到完整响应的时间。通常使用百分位分布而非平均值:

  • P50(中位数):反映典型用户体验。
  • P95 / P99:反映尾部延迟,直接影响长尾用户流失。
  • P999:用于核心交易链路,容忍度极低。

2.3.2 错误率(Error Rate)

衡量请求失败的比例。需区分:

  • 显式错误:HTTP 5xx、RPC 超时、业务返回错误码。
  • 隐式错误:返回 200 但内容为空、数据不一致、校验失败。

2.3.3 吞吐量(Throughput)

衡量系统在单位时间内处理的请求量。通常与延迟联合观察:

  • QPS(Queries Per Second):适用于 API 网关、数据库。
  • RPS(Requests Per Second):适用于 Web 服务器。
  • TPS(Transactions Per Second):适用于支付、订单等事务型系统。
常见误区:不要将“CPU 使用率”或“内存占用”直接作为 SLI。这些是资源指标,不是用户可感知的服务水平指标。只有当资源耗尽导致延迟或错误率上升时,才通过 SLI 间接反映。

2.4 SLI 与 SLO 关系图

下图展示了从原始监控数据到 Error Budget 的完整链路:

SLI 与 SLO 关系图 SLI → SLO → Error Budget 链路 原始监控数据 请求日志 / 指标采集 SLI 定义 延迟 / 错误率 / 吞吐量 SLO 目标 P99 ≤ 200ms / 错误率 ≤ 0.1% Error Budget = 1 − SLO 可容忍的故障时间 / 错误次数 熔断 / 降级 / 限流阈值调整 💡 核心关系 SLO 越严格 → Error Budget 越小 → 变更越保守

2.5 三类 SLI 的典型 SLO 参考

SLI 类型 典型测量方式 宽松 SLO 严格 SLO 适用场景
延迟 P99 响应时间 ≤ 1000ms ≤ 100ms API 网关、搜索服务
错误率 5xx 占比 ≤ 1% ≤ 0.01% 支付、订单核心链路
吞吐量 QPS / RPS ≥ 峰值 80% ≥ 峰值 95% 秒杀、流媒体、消息队列

2.6 SLI 聚合与多维度 SLO

实际系统中,一个服务通常同时监控多个 SLI,并设定复合 SLO。下图展示了一个典型微服务的 SLI 仪表盘结构:

多维度 SLI 聚合示例 微服务多维度 SLI 聚合示例 订单服务 延迟 SLI P99 ≤ 200ms 错误率 SLI 5xx ≤ 0.1% 吞吐量 SLI QPS ≥ 5000 复合 SLO:三项同时达标 → 健康
实践要点:
• 每个 SLI 必须对应一个明确的 SLO,避免“只测量不设目标”。
• SLO 的评估窗口建议使用 30 天滚动窗口,兼顾稳定性与灵敏度。
• 当多个 SLI 同时逼近 SLO 边界时,优先保障错误率和延迟,吞吐量可适当降级。