2. SLI基础概念
在构建 SLO 之前,必须先理解 SLI(Service Level Indicator,服务等级指标)。SLI 是 SLO 的量化基础,也是误差预算计算的原始输入。如果 SLI 定义错误,后续所有 SLO 和误差预算都将失去意义。本节从定义、特征和视角三个层面建立 SLI 的完整认知。
2.1 SLI 定义
SLI 是对服务某个特定维度(如延迟、可用性、吞吐量)的直接量化测量值,通常表示为一段时间内的比率、分布或计数。SLI 不是主观感受,而是可采集、可聚合、可对比的数值。
| 维度 | SLI 示例 | 测量方式 |
|---|---|---|
| 可用性 | 请求成功比率 | 成功响应数 / 总请求数 |
| 延迟 | P95 响应时间 | 排序后第 95 百分位的响应时间 |
| 吞吐量 | 每秒请求数 | 时间窗口内请求总数 / 窗口时长 |
| 错误率 | HTTP 5xx 比率 | 5xx 响应数 / 总响应数 |
| 饱和度 | CPU 使用率 | 已用 CPU / 总 CPU 容量 |
关键公式: SLI = 好事件计数 / 总事件计数。例如:SLI可用性 = (总请求数 - 失败请求数) / 总请求数。
2.2 好的 SLI 特征
并非所有可测量的指标都适合作为 SLI。一个高质量的 SLI 应具备以下五个特征:
- 可测量性(Measurable):指标必须能从监控系统、日志或探针中稳定采集,且采集频率满足 SLO 窗口要求。
- 可理解性(Understandable):团队所有成员(包括非技术角色)都能理解该指标的含义和业务影响。
- 可行动性(Actionable):当 SLI 恶化时,团队能明确知道该采取什么修复动作。
- 用户相关性(User-relevant):SLI 必须反映真实用户体验,而非仅反映基础设施内部状态。
- 稳定性(Stable):指标不应因微小波动而剧烈变化,避免噪声干扰 SLO 判断。
实践建议: 优先选择“用户可感知”的 SLI。例如,使用“页面加载时间 P95”而非“服务器 CPU 平均负载”,因为前者直接关联用户体验。
2.3 用户视角与系统视角的 SLI
SLI 的定义视角决定了 SLO 的适用场景。两种视角的差异如下:
| 对比维度 | 用户视角 SLI | 系统视角 SLI |
|---|---|---|
| 测量点 | 客户端、浏览器、用户终端 | 服务器端、中间件、基础设施 |
| 关注对象 | 端到端体验(如首屏时间) | 组件健康度(如数据库查询延迟) |
| 典型指标 | Apdex 分数、页面完全加载时间 | CPU 使用率、磁盘 IO 延迟 |
| 优势 | 直接反映业务影响 | 易于定位根因、粒度细 |
| 劣势 | 受网络、客户端环境影响大 | 可能偏离真实用户体验 |
| SLO 适用场景 | 外部客户承诺、业务 SLA | 内部运维目标、容量规划 |
在实际工程中,用户视角 SLI 用于对外承诺,系统视角 SLI 用于对内调试。两者应建立映射关系:当系统视角 SLI 恶化时,能预测用户视角 SLI 的变化趋势。
常见误区: 只定义系统视角 SLI 而忽略用户视角 SLI。这会导致 SLO 达标但用户仍然投诉的情况。例如:服务器 CPU 正常,但 CDN 回源延迟导致用户页面加载缓慢。
2.4 SLI 视角关系图
下图展示了用户视角与系统视角 SLI 在服务架构中的位置关系,以及它们如何共同支撑 SLO 定义:
2.5 SLI 选择决策流程
在实际项目中,选择正确的 SLI 需要遵循以下步骤:
- 识别关键用户旅程:列出用户最常使用的 3-5 个核心功能路径。
- 确定体验维度:对每个旅程,选择可用性、延迟、吞吐量中的 1-2 个维度。
- 选择测量点:决定在客户端还是服务端采集数据。
- 定义好事件标准:明确什么算“成功”或“正常”。例如:HTTP 状态码 200-399 且响应时间 < 2s。
- 验证可采集性:确认现有监控系统能否稳定输出该指标。
案例: 一个电商平台的“商品搜索”用户旅程,选择用户视角 SLI 为“搜索响应时间 P95 < 1.5s”,系统视角 SLI 为“搜索引擎查询延迟 P99 < 500ms”。当系统视角 SLI 超标时,团队立即扩容搜索集群,确保用户视角 SLI 不突破 SLO。
2.6 常见 SLI 定义错误与修正
| 错误类型 | 错误示例 | 问题分析 | 正确做法 |
|---|---|---|---|
| 指标过于笼统 | “系统可用性” | 未区分用户请求与健康检查 | “用户请求成功率(排除健康检查)” |
| 忽略长尾 | “平均延迟” | 平均值掩盖了慢请求 | “P95 或 P99 延迟” |
| 视角错位 | 用“CPU 使用率”做客户 SLO | 客户不关心 CPU | 用“API 响应时间”替代 |
| 窗口过短 | “每分钟错误率” | 噪声大,难以判断趋势 | “5 分钟滑动窗口错误率” |