3. SLI分类与选择
在构建服务等级指标(SLI)时,首先需要明确指标的类别。Google SRE 经典体系将 SLI 归纳为五大黄金信号:可用性、延迟、吞吐量、错误率 和 饱和度。正确分类是后续定义 SLO 和设计误差预算的前提。
核心原则: 每个 SLI 必须对应一个明确的“好事件”定义。例如,“可用性”的好事件是“请求成功”,“延迟”的好事件是“响应时间 ≤ 阈值”。
3.1 五大 SLI 分类详解
| 分类 | 定义 | 典型测量方式 | 常见陷阱 |
|---|---|---|---|
| 可用性 | 服务能够正常处理请求的时间比例或请求比例。 | 成功请求数 / 总请求数;或正常运行时间 / 总时间。 | 忽略健康检查端点;将 4xx 错误计入不可用。 |
| 延迟 | 服务响应请求所花费的时间。 | 百分位数(p50, p95, p99);通常以毫秒为单位。 | 仅使用平均值;未区分客户端与服务器端延迟。 |
| 吞吐量 | 系统在单位时间内处理的请求量或数据量。 | 每秒请求数(RPS)、每秒事务数(TPS)、每秒字节数。 | 与并发数混淆;未考虑请求大小差异。 |
| 错误率 | 请求处理失败的比率。 | HTTP 5xx 错误数 / 总请求数;或业务逻辑错误数。 | 仅监控显式错误;忽略隐式错误(如返回 200 但数据错误)。 |
| 饱和度 | 服务资源被使用的程度,通常反映容量瓶颈。 | CPU 使用率、内存使用率、队列深度、连接池占用率。 | 使用 100% 作为唯一阈值;忽略软限制(如 GC 压力)。 |
选择优先级: 对于用户可见的在线服务,推荐优先定义 可用性 和 延迟 的 SLI;对于批处理或数据管道,吞吐量 和 错误率 更为关键;饱和度 通常作为预警指标,辅助容量规划。
3.2 SLI 分类与选择流程
选择正确的 SLI 需要遵循系统化的步骤,避免主观臆断。以下流程帮助团队从用户旅程出发,逐步收敛到可测量的指标。
- 识别用户关键操作: 列出用户最常执行或最重要的操作(如登录、搜索、下单)。
- 映射到系统组件: 将每个操作分解为后端依赖(API 网关、数据库、缓存)。
- 选择黄金信号: 对每个组件,从五大分类中选取 1-2 个最能反映用户体验的指标。
- 定义“好事件”: 明确什么算作一次“好”的请求或状态(例如:延迟 ≤ 200ms 且状态码 2xx)。
- 验证可测量性: 确认指标可以从现有监控系统(Prometheus、Datadog)中提取,且采集成本可控。
3.3 实战案例:电商下单流程的 SLI 选择
以电商平台的“用户下单”操作为例,展示如何为不同组件选择合适的 SLI 分类。
| 系统组件 | 推荐 SLI 分类 | 具体指标定义 | 选择理由 |
|---|---|---|---|
| 前端 / API 网关 | 可用性、延迟 | HTTP 请求成功率 ≥ 99.9%;p99 延迟 ≤ 500ms | 直接面向用户,可用性和延迟直接影响转化率。 |
| 订单服务 | 错误率、延迟 | 业务错误率 ≤ 1%;p95 延迟 ≤ 200ms | 业务逻辑复杂,需区分系统错误与业务错误。 |
| 库存数据库 | 饱和度、延迟 | 连接池使用率 ≤ 80%;p99 查询延迟 ≤ 50ms | 数据库是常见瓶颈,饱和度预警可提前扩容。 |
| 支付回调 | 吞吐量、错误率 | 处理能力 ≥ 1000 TPS;回调失败率 ≤ 0.1% | 大促期间流量突增,吞吐量是核心关注点。 |
常见误区: 不要试图为每个组件定义所有五个 SLI。过多的指标会导致监控噪音和运维成本上升。每个组件选择 1-2 个最关键的信号即可。
3.4 饱和度 SLI 的深入理解
饱和度是五个黄金信号中最容易被误解的一个。它不直接衡量用户体验,而是衡量系统距离容量极限的程度。饱和度 SLI 通常作为前兆指标,在可用性或延迟恶化之前发出预警。
- CPU 饱和度: 不仅看 CPU 使用率,还要看 CPU 运行队列长度。当运行队列持续超过 vCPU 数量的 2 倍时,通常意味着饱和。
- 内存饱和度: 关注交换(swap)使用率和 OOM Killer 事件。即使内存使用率未到 100%,频繁的页面交换也会导致性能急剧下降。
- I/O 饱和度: 磁盘 I/O 等待时间和队列深度是关键指标。对于数据库,I/O 饱和度往往比 CPU 更早成为瓶颈。
- 网络饱和度: 网卡丢包率和缓冲区溢出是典型信号。对于微服务架构,网络饱和度可能表现为连接超时。
3.5 选择 SLI 的检查清单
在最终确定 SLI 之前,建议团队对照以下清单进行评审,确保指标的有效性和可操作性。
- 用户相关性: 该 SLI 是否直接或间接反映用户体验?如果指标变差,用户是否能感知到?
- 可测量性: 指标是否可以从现有监控基础设施中可靠采集?采集频率是否足够(通常 1 分钟粒度)?
- 可区分性: 指标能否区分“好”与“坏”事件?阈值是否明确且合理?
- 可操作性: 当 SLI 违反 SLO 时,团队是否有明确的响应流程或自动化修复手段?
- 避免代理指标: 是否使用了间接指标代替直接指标?例如,用 CPU 使用率代替请求延迟,这可能导致误判。
最佳实践: 初始阶段为每个服务定义 2-3 个 SLI,运行一个季度后根据实际告警和事故复盘进行调整。SLI 不是一成不变的,它应该随着系统架构和用户需求的变化而演进。