2. SLI 定义与分类:可用性、延迟、吞吐量、错误率
SLI(Service Level Indicator,服务等级指标)是衡量系统某一维度服务质量的具体量化指标。在 Error Budget 体系中,SLI 是计算错误预算的原始数据来源,其口径定义直接决定了错误预算的准确性与可操作性。本章将系统阐述四大核心 SLI 的定义、计算口径与选择原则。
2.1 SLI 的核心定义与量化公式
SLI 必须满足 可测量、可聚合、可对比 三个基本条件。一个标准的 SLI 定义包含:测量对象、测量窗口、成功标准、聚合方式。
| SLI 类型 | 测量对象 | 典型成功标准 | 聚合方式 |
|---|---|---|---|
| 可用性 SLI | 请求/任务 | 返回非 5xx 状态码 | 成功请求数 / 总请求数 |
| 延迟 SLI | 请求耗时 | 耗时 ≤ 阈值(如 200ms) | 满足条件的请求占比(如 p99) |
| 吞吐量 SLI | 单位时间处理量 | ≥ 最低吞吐阈值 | 实际吞吐 / 目标吞吐 |
| 错误率 SLI | 错误响应 | 错误占比 ≤ 阈值 | 错误请求数 / 总请求数 |
关键原则:SLI 的成功标准必须与用户真实体验强相关。例如,内部重试成功但用户已超时的请求,应计入失败。
2.2 可用性 SLI:服务存活的黄金指标
可用性 SLI 衡量服务在给定时间窗口内正常提供服务的概率。其核心公式为:
Availability SLI = (Successful Requests / Total Requests) × 100%
其中:
- Successful Requests = 返回 2xx/3xx 且业务逻辑正确的请求
- Total Requests = 所有到达服务端的合法请求(含健康检查)
选择原则:
- 粒度匹配:微服务架构下,每个独立服务应有独立的可用性 SLI,避免全局聚合掩盖局部故障。
- 排除噪声:爬虫攻击、DDoS 流量应通过限流/清洗后计入,或单独标记为“无效请求”。
- 窗口选择:推荐使用滚动窗口(如 1 分钟、5 分钟)而非固定日历窗口,便于实时计算错误预算。
实战建议:对于关键支付链路,可用性 SLI 的成功标准应包含“业务最终一致性确认”,即不仅看 HTTP 状态码,还要确认数据库事务已提交。
2.3 延迟 SLI:用户体验的感知温度计
延迟 SLI 通常使用 百分位分布 而非平均值,因为平均值会掩盖长尾延迟。最常用的指标是 p50、p95、p99 延迟。
Latency SLI (p99) = 第 99 百分位的请求耗时 ≤ 目标阈值(如 500ms)
计算方式:
1. 将窗口内所有请求耗时升序排列
2. 取第 99% 位置的耗时值
3. 若该值 ≤ 阈值,则视为该窗口延迟达标
选择原则:
- 区分服务类型:在线实时服务(如 API 网关)关注 p99;离线批处理服务关注 p50 或吞吐量。
- 客户端 vs 服务端:优先使用客户端采集的延迟数据(真实用户体验),服务端延迟仅作为辅助参考。
- 避免“延迟欺骗”:如果服务端在超时后立即返回错误,该请求不应计入延迟统计,而应归入错误率。
常见误区:仅使用平均延迟作为 SLI。平均延迟 100ms 可能掩盖 90% 请求 50ms + 10% 请求 550ms 的长尾问题,导致错误预算计算失真。
2.4 吞吐量 SLI:容量水位与限流依据
吞吐量 SLI 衡量系统在单位时间内能处理的请求量或数据量。它通常与容量规划、自动扩缩容策略直接关联。
Throughput SLI = Actual Throughput / Target Throughput
其中:
- Actual Throughput = 实际完成的请求数/秒(RPS)或数据量/秒(MB/s)
- Target Throughput = 基于容量测试或 SLO 约定的目标值
选择原则:
- 区分正常流量与峰值:吞吐量 SLI 应基于基线流量设定,峰值流量通过弹性扩缩容应对,不直接计入错误预算。
- 与限流策略联动:当实际吞吐超过目标吞吐的 120% 时,应触发限流保护,防止系统过载导致可用性下降。
- 数据一致性:对于异步处理系统(如消息队列),吞吐量 SLI 应同时测量生产端和消费端,避免积压。
2.5 错误率 SLI:故障的早期预警系统
错误率 SLI 关注的是失败请求占总请求的比例,是发现系统异常最敏感的指标之一。其定义比可用性 SLI 更精细,通常按错误类型分层。
Error Rate SLI = (Error Requests / Total Requests) × 100%
错误分类示例:
- 5xx 错误:服务端内部错误
- 4xx 错误:客户端请求错误(需排除 429 限流)
- 业务错误:返回 200 但业务逻辑失败(如“余额不足”)
选择原则:
- 分层定义:建议至少定义“系统错误率”(5xx)和“业务错误率”(业务码)两个独立 SLI。
- 排除预期错误:健康检查失败、已降级功能的错误不应计入错误率 SLI,否则会稀释错误预算的敏感性。
- 窗口敏感度:错误率 SLI 的窗口不宜过大(建议 ≤ 5 分钟),否则会延迟故障发现。
量化策略视角:在 Error Budget 体系中,错误率 SLI 是计算“错误预算消耗速率”的核心输入。当错误率突然上升时,错误预算消耗速率会急剧增加,触发自动告警或降级策略。
2.6 SLI 选择原则与四维决策矩阵
在实际项目中,并非所有服务都需要同时定义四种 SLI。以下决策矩阵帮助 SRE 团队根据服务特性选择最合适的 SLI 组合:
| 服务类型 | 必选 SLI | 可选 SLI | 选择理由 |
|---|---|---|---|
| 用户面 API 网关 | 可用性、延迟 (p99) | 错误率、吞吐量 | 直接面向用户,延迟和可用性最敏感 |
| 消息队列/异步处理 | 吞吐量、错误率 | 延迟 (p50) | 关注处理能力和积压,延迟容忍度较高 |
| 数据库/存储层 | 可用性、延迟 (p95) | 吞吐量 | 存储层故障影响全局,延迟影响所有上游 |
| 批处理/离线计算 | 吞吐量、错误率 | 可用性 | 关注作业完成率和数据正确性 |
通用选择原则(按优先级排序):
- 用户感知优先:优先选择用户能直接感知的指标(如页面加载延迟、下单成功率)。
- 可测量性优先:选择已有埋点或易于采集的指标,避免为 SLI 引入过高的观测成本。
- 可行动性优先:SLI 的恶化必须能触发明确的运维动作(告警、扩缩容、降级)。
- 正交性优先:选择的多个 SLI 之间应尽量正交,避免冗余(如可用性 SLI 和错误率 SLI 高度相关时,可只选其一)。
2.7 SLI 口径动态调整的量化策略基础
SLI 口径不是一成不变的。在 Error Budget 量化策略中,SLI 口径需要根据以下因素进行动态调整:
- 服务演进:新功能上线后,原有 SLI 的成功标准可能需要扩展(如新增业务错误码)。
- 容量变化:吞吐量 SLI 的目标值应随集群规模、流量模型定期校准。
- 故障复盘:每次故障后,检查现有 SLI 是否能在 5 分钟内捕获同类问题,若不能则调整口径。
- 用户行为变化:当用户端超时配置变更时,延迟 SLI 的阈值应同步调整。