4. SLI 设计原则:如何选择有效的 SLI 指标

SLI(Service Level Indicator,服务等级指标)是 SLO 监控的基石。选择错误的 SLI 会导致告警噪音泛滥或盲区扩大。本章聚焦于两大经典方法论:Google 黄金信号(The Four Golden Signals)与 USE 方法(Utilization、Saturation、Errors),并给出可落地的指标选择原则。

4.1 黄金信号:面向用户的四大观测维度

Google SRE 团队在《SRE 运维解密》中提出,对于用户可见的服务,只需关注四个核心信号即可覆盖绝大多数故障场景:

信号 定义 典型指标示例 故障表现
延迟(Latency) 请求从发出到收到响应的时间 p50 / p95 / p99 响应时间 用户感知卡顿、超时
错误率(Errors) 请求失败的比率(显式+隐式) HTTP 5xx 占比、业务错误码率 功能不可用、数据不一致
吞吐量(Traffic) 系统处理的请求量或数据量 QPS、RPS、带宽使用率 流量突增导致过载、流量突降表示异常
饱和度(Saturation) 资源被使用的程度,通常有瓶颈上限 CPU 使用率、内存使用率、连接池占用 排队、限流、拒绝服务
实践要点:黄金信号优先从用户视角采集。例如延迟应测量客户端到服务端的全链路耗时,而非仅服务端处理时间;错误率需包含 HTTP 500 和业务逻辑错误(如“购物车结算失败”返回 200 但 body 含 error code)。
黄金信号与用户请求关系图 用户 服务 (API / 应用) 延迟 错误率 吞吐量 饱和度 说明:用户请求进入服务后,延迟、错误率、吞吐量、饱和度四个信号共同描述服务健康状态。 饱和度通常作为延迟和错误率的根因线索,而非直接面向用户的 SLI。

4.2 USE 方法:面向资源的瓶颈定位

USE 方法由 Brendan Gregg 提出,适用于基础设施层(服务器、数据库、中间件)的指标设计。它从三个维度评估每个资源:

  • Utilization(使用率):资源被占用的平均比例。例如 CPU 利用率 70%、内存使用率 80%。
  • Saturation(饱和度):资源无法服务的额外排队或等待量。例如 CPU 运行队列长度、磁盘 I/O 等待队列。
  • Errors(错误):资源发生的错误事件数。例如网卡丢包、磁盘坏道、内存 ECC 错误。
黄金信号 vs USE 方法:黄金信号面向用户,USE 方法面向资源。两者互补:黄金信号告诉你“用户是否受损”,USE 方法告诉你“哪个资源导致受损”。在告警降噪中,建议将 USE 指标作为延迟/错误率告警的根因上下文,而非直接触发告警。

4.3 如何选择有效的 SLI:五条设计原则

  1. 用户相关原则:SLI 必须直接反映用户体验。例如“API p99 延迟”优于“CPU 空闲率”。
  2. 可测量原则:指标必须能在生产环境持续采集,且采集成本可控。避免需要全链路追踪才能计算的复杂指标。
  3. 可区分原则:SLI 应能区分正常与异常。例如“平均延迟”容易被长尾掩盖,应使用百分位延迟(p50/p95/p99)。
  4. 可行动原则:SLI 恶化时,团队必须有明确的修复动作。例如“错误率 > 1%”触发告警后,能直接定位到错误日志。
  5. 最小化原则:每个服务只选择 3~5 个核心 SLI,避免指标爆炸。过多的 SLI 会导致告警疲劳和 SLO 管理混乱。
SLI 选择原则与黄金信号 + USE 融合架构 用户请求 黄金信号(面向用户) 延迟 · 错误率 · 吞吐量 · 饱和度 SLI 选择五原则 用户相关 · 可测量 · 可区分 · 可行动 · 最小化 USE 方法(面向资源) 使用率 · 饱和度 · 错误 SLO 目标 SLI 阈值 → 错误预算 黄金信号定义“观测什么”,USE 方法定义“为什么出问题”,SLI 原则确保指标可落地。

4.4 常见 SLI 选择案例

服务类型 推荐 SLI 对应黄金信号 USE 根因指标
Web API p99 延迟 < 500ms,错误率 < 1% 延迟、错误率 CPU 使用率、连接池饱和度
数据库 查询 p95 延迟 < 100ms,慢查询占比 延迟、吞吐量 磁盘 I/O 使用率、锁等待队列
消息队列 端到端投递延迟 < 2s,堆积量 延迟、饱和度 磁盘使用率、网络带宽饱和度
CDN / 边缘 缓存命中率 > 90%,首字节时间 延迟、吞吐量 带宽使用率、源站连接池饱和度
避坑提醒:不要将“CPU 使用率 > 80%”直接作为面向用户的 SLI。CPU 高不一定导致用户延迟升高(例如批处理任务)。正确的做法是:将 CPU 饱和度作为 USE 指标,关联到黄金信号中的延迟告警,作为根因上下文展示。

4.5 从 SLI 到 SLO:指标聚合与阈值设定

选定 SLI 后,需要定义 SLO 目标。核心步骤:

  • 采集窗口:通常使用滚动窗口(如 30 天)计算 SLI 合规率。
  • 阈值设定:基于历史数据确定合理基线。例如“过去 30 天 p99 延迟 99% 的时间低于 500ms”。
  • 错误预算:SLO 目标与 100% 的差值即为错误预算。例如 SLO = 99.9%,则错误预算 = 0.1%。
  • 告警触发:当错误预算消耗速度超过预期时触发告警,而非 SLI 单次超标。
# 示例:基于 Prometheus 的 SLI 聚合查询(p99 延迟)
histogram_quantile(0.99,
  sum(rate(http_request_duration_seconds_bucket[5m])) by (le)
)

# 错误率计算
sum(rate(http_requests_total{status=~"5.."}[5m]))
/
sum(rate(http_requests_total[5m]))
降噪关键:将 SLI 聚合到 SLO 错误预算后,告警从“指标值 > 阈值”转变为“错误预算消耗速率 > 阈值”。这能过滤掉瞬时抖动,只关注持续恶化趋势,大幅降低告警噪音。