SLI 指标设计:延迟、流量、错误、饱和度四大黄金信号

在 SRE 实践中,SLI(Service Level Indicator,服务等级指标)是衡量服务质量最直接的量化标尺。Google 在《SRE 运维解密》中提出的四大黄金信号(Four Golden Signals)——延迟、流量、错误、饱和度,覆盖了用户感知与系统容量两个维度。本章将逐一拆解每个信号的定义原则、有效阈值设定方法,以及如何避免常见的“伪 SLI”陷阱。

2.1 四大黄金信号总览

下表对比了四个信号的核心关注点、典型测量方式与常见误区:

黄金信号 关注维度 典型测量方式 常见误区
延迟(Latency) 用户等待时间 P50 / P95 / P99 分位延迟 只关注平均值,忽略长尾
流量(Traffic) 请求负载量 QPS / RPS / 带宽 / 并发连接数 只统计成功请求,忽略重试
错误(Errors) 请求失败比例 HTTP 5xx / 4xx / 超时 / 业务错误码 只统计显式错误,忽略隐式错误
饱和度(Saturation) 资源耗尽程度 CPU 使用率 / 内存占用 / 连接池水位 / 队列深度 使用百分比而非余量
核心原则:SLI 必须从用户视角定义。例如,延迟 SLI 应测量“用户发起请求到收到完整响应的时间”,而非“服务端处理时间”。用户感知不到服务端内部的重试、缓存穿透或异步补偿逻辑。

2.2 延迟(Latency)—— 分位值比平均值更重要

延迟 SLI 是用户满意度最直接的反映。定义有效的延迟 SLI 需遵循以下步骤:

  1. 选择分位点:推荐使用 P50(中位数) 反映典型体验,P95 反映大多数用户,P99 反映长尾用户。避免使用平均值,因为平均值会被极端值严重扭曲。
  2. 设定阈值:例如“P95 延迟 ≤ 500ms”或“P99 延迟 ≤ 2s”。阈值应基于业务容忍度,而非基础设施能力。
  3. 区分成功与失败:延迟 SLI 通常只统计成功请求,但失败请求的延迟也应单独监控,防止“快速失败”掩盖真实问题。
案例:某 API 网关的延迟 SLI 定义为“过去 5 分钟内,所有成功请求的 P99 延迟 ≤ 1s”。若 P99 超过 1s,则触发告警。注意:该 SLI 排除了 4xx/5xx 响应,因为错误响应的延迟通常很短,会拉低整体延迟数据。

2.3 流量(Traffic)—— 区分有效负载与无效重试

流量 SLI 用于衡量系统当前承受的请求压力。定义要点:

  • 明确计数对象:是 HTTP 请求数、gRPC 调用数、消息队列的入队速率,还是数据库的查询次数?
  • 去重重试:客户端自动重试会导致流量虚高。SLI 应尽量统计去重后的唯一请求,或在告警时考虑重试因子。
  • 区分读写:读流量与写流量的资源消耗差异巨大,建议分别定义 SLI。
流量类型 典型 SLI 定义 测量工具
HTTP 入口 每分钟请求数(RPM) 负载均衡器指标
消息队列 每秒入队消息数(msg/s) Kafka / RabbitMQ 指标
数据库 每秒查询数(QPS) 数据库监控插件

2.4 错误(Errors)—— 显式错误与隐式错误

错误 SLI 是最容易被低估的信号。除了 HTTP 5xx 和 4xx,还需关注:

  • 显式错误:HTTP 500、503、504;gRPC 状态码 Internal、Unavailable;超时异常。
  • 隐式错误:返回 200 但业务逻辑失败(如“下单成功”但库存扣减失败);响应体包含错误码;响应时间极短(< 10ms)可能表示缓存穿透或空响应。
  • 错误率计算:通常定义为“错误请求数 / 总请求数 × 100%”。阈值建议 ≤ 0.1% 或 ≤ 1%,视业务关键程度而定。
避坑提示:不要只监控“错误率”而忽略“错误量”。即使错误率很低(如 0.01%),如果流量巨大(如 1000 万 QPS),错误量可能达到 1000 次/秒,仍需要立即处理。

2.5 饱和度(Saturation)—— 资源余量比使用率更关键

饱和度 SLI 用于预测系统何时会达到瓶颈。定义要点:

  1. 选择关键资源:CPU、内存、磁盘 I/O、网络带宽、数据库连接池、线程池、队列深度。
  2. 使用余量而非百分比:例如“可用内存 < 2GB”比“内存使用率 > 80%”更直接。因为 80% 使用率在 8GB 内存的机器上还剩 1.6GB,而在 4GB 机器上只剩 0.8GB,风险完全不同。
  3. 关注队列深度:队列深度是饱和度的早期信号。例如,Tomcat 线程池的等待队列长度 > 100 时,即使 CPU 使用率只有 60%,系统也可能即将过载。

2.6 四大黄金信号的关系与联动

四个信号并非孤立存在,它们之间存在典型的因果链。下图展示了常见的故障传播路径:

四大黄金信号联动关系图 四大黄金信号联动关系 流量 (Traffic) 请求量上升 饱和度 (Saturation) 资源耗尽 延迟 (Latency) 响应变慢 错误 (Errors) 请求失败 负载增加 排队等待 超时导致失败 拒绝连接 说明: 流量上升 → 饱和度增加 → 延迟升高 → 错误率上升。饱和度也可直接导致错误(如连接池耗尽)。 监控时应建立联动告警,避免单一信号误判。

2.7 定义有效 SLI 的检查清单

在定义每个 SLI 时,建议对照以下清单进行验证:

检查项 说明 示例
1. 用户视角 SLI 是否反映用户真实体验? “端到端延迟”而非“服务端处理时间”
2. 可测量性 指标是否能在生产环境持续采集? 避免依赖人工上报或采样率过低的指标
3. 可区分性 能否区分成功与失败、正常与异常? HTTP 200 但业务失败需单独标记
4. 阈值合理性 阈值是否基于历史数据或业务要求? P99 延迟阈值参考过去 30 天基线
5. 告警有效性 SLI 触发告警后是否能指导行动? 避免“CPU 使用率 > 90%”这种无上下文的告警

2.8 实战:为采集作业平台定义 SLI

假设我们正在为“采集作业平台”设计 SLI,该平台负责从多个数据源拉取日志并写入消息队列。以下是针对四大黄金信号的具体定义:

采集作业平台 SLI 定义示例:
  • 延迟:每次采集任务从开始到完成写入的 P95 耗时 ≤ 30s。
  • 流量:每分钟采集的日志条数(EPS)≥ 10000 条/分钟(低于此值可能表示数据源异常)。
  • 错误:采集失败的任务数 / 总任务数 ≤ 1%。失败包括:连接超时、认证失败、写入队列失败。
  • 饱和度:采集作业所在主机的可用内存 ≥ 1GB,且消息队列的积压长度 ≤ 5000 条。

通过以上定义,SRE 团队可以快速定位问题:当延迟升高时,检查饱和度(内存/队列);当错误率上升时,检查流量是否突增或数据源是否不可达。四个信号互为补充,形成完整的可观测性闭环。