基础设施 SLI 分类:计算、网络、存储与中间件
在可观测性工程中,基础设施 SLI 的制定并非一刀切。不同资源类型具有截然不同的故障模式、性能瓶颈和度量单位。将基础设施 SLI 按资源域分类,是设计精准、可操作口径的第一步。本章将基础设施 SLI 划分为四大类:计算资源、网络资源、存储资源和中间件,并逐一拆解其核心关注点与典型参数设计。
2.1 四大分类总览
下表从关注维度、典型故障模式和核心 SLI 指标三个角度,对四类基础设施 SLI 进行横向对比,帮助建立全局认知。
| SLI 分类 | 关注维度 | 典型故障模式 | 核心 SLI 指标示例 |
|---|---|---|---|
| 计算资源 SLI | CPU、内存、进程、调度 | CPU 饥饿、OOM、线程死锁 | CPU 利用率、内存使用率、就绪线程数 |
| 网络资源 SLI | 带宽、延迟、丢包、连接 | 网络分区、丢包率飙升、连接耗尽 | 网络延迟 P99、丢包率、TCP 重传率 |
| 存储资源 SLI | IOPS、吞吐、延迟、容量 | 磁盘满、IO 等待、慢查询 | 磁盘利用率、IO 延迟、读写吞吐 |
| 中间件 SLI | 队列深度、连接数、请求延迟 | 消息堆积、连接池耗尽、主从切换 | 队列长度、客户端连接数、P99 延迟 |
设计提示: 分类的核心目的是将 SLI 口径与资源自身的故障域对齐。例如,计算资源 SLI 应关注“能否分配 CPU 时间片”,而存储资源 SLI 应关注“IO 请求能否在预期时间内完成”。混用分类口径会导致 SLI 失效。
2.2 计算资源 SLI
计算资源 SLI 主要覆盖 CPU 和 内存 两个维度,同时也包括进程调度和线程状态。其核心目标是衡量计算单元是否能够及时、稳定地分配处理能力。
- CPU 利用率:通常取 1m/5m 平均,但需注意区分 user/system/iowait。高 iowait 应归入存储 SLI 而非计算 SLI。
- 内存使用率:关注实际使用量 vs 总量,以及 swap 使用情况。swap 出现通常意味着内存不足。
- 进程/线程状态:不可中断睡眠(D 状态)进程数、阻塞线程数,反映调度健康度。
- 上下文切换:过高的上下文切换可能暗示锁竞争或线程数配置不当。
典型口径示例: 计算资源 SLI = 1 - (CPU 饥饿时间 / 总时间窗口)。其中“CPU 饥饿时间”定义为 CPU 利用率持续超过 90% 且 runqueue 长度大于 vCPU 数 2 倍的时间段。
2.3 网络资源 SLI
网络资源 SLI 关注数据在节点间传输的可用性、延迟和可靠性。网络故障往往是分布式系统中影响范围最广的故障类型。
- 网络延迟:通常使用 ICMP ping 或 TCP 握手延迟,取 P50/P95/P99 分位值。
- 丢包率:通过探针或内核统计(如 /proc/net/stat)获取,丢包率超过 0.1% 通常需要告警。
- TCP 重传率:重传段数 / 总发送段数,反映网络拥塞或链路质量。
- 连接数:当前 ESTABLISHED 连接数 vs 最大连接数,防止连接耗尽。
避坑提醒: 网络 SLI 的采样周期非常关键。过长的采样间隔(如 5m)会掩盖瞬态丢包;过短的间隔(如 1s)则可能引入大量噪声。建议根据业务抖动容忍度,选择 10s-30s 的采样窗口。
2.4 存储资源 SLI
存储资源 SLI 覆盖块存储、文件系统和对象存储。其核心指标围绕 IO 能力和容量展开。
- 磁盘利用率:已用空间 / 总空间,通常设置 80% 告警阈值,90% 为严重阈值。
- IO 延迟:平均 IO 等待时间(await),以及读写延迟分位值。SSD 环境下 await 超过 10ms 通常意味着异常。
- IOPS 与吞吐:每秒读写次数和每秒读写字节数,用于衡量存储性能是否达到预期。
- inode 使用率:在 Linux 文件系统中,inode 耗尽会导致无法创建新文件,即使磁盘空间仍有剩余。
典型口径示例: 存储 SLI = 成功 IO 请求数 / 总 IO 请求数。其中“成功”定义为 IO 请求在 500ms 内返回且无错误。此口径同时覆盖了可用性和延迟。
2.5 中间件 SLI
中间件 SLI 覆盖消息队列、缓存、数据库代理、负载均衡器等基础设施组件。中间件的故障模式通常与连接状态和队列深度强相关。
- 队列深度:消息队列中待处理消息的数量。持续增长意味着消费能力不足。
- 客户端连接数:当前活跃连接 vs 最大连接数,防止连接池耗尽。
- 请求延迟:中间件处理请求的 P99 延迟,反映组件自身性能。
- 主从同步延迟:对于有主从架构的中间件(如 Redis、MySQL Proxy),同步延迟是数据一致性的关键指标。
设计提示: 中间件 SLI 的阈值往往需要根据业务流量动态调整。例如,消息队列的“正常”队列深度在促销期间可能是平时的 10 倍。建议使用动态基线或同比环比算法来设定告警阈值。
2.6 分类关系与依赖 SVG 图
下图展示了四类基础设施 SLI 之间的依赖关系与数据流向。理解这种依赖关系,有助于在故障发生时快速定位根因。
2.7 分类设计原则与常见误区
在实际设计 SLI 分类时,以下原则和误区值得特别关注:
| 原则 / 误区 | 说明 | 示例 |
|---|---|---|
| 原则:单一职责 | 每个 SLI 只衡量一种资源类型的单一维度 | CPU 利用率 SLI 不应混入 IO 等待时间 |
| 原则:故障域对齐 | SLI 的阈值和口径应与该资源的典型故障模式匹配 | 存储 SLI 的延迟阈值应基于磁盘类型(SSD vs HDD)设定 |
| 误区:过度聚合 | 将多个资源类型的指标合并为一个 SLI,导致无法定位 | “基础设施可用性” = 计算 + 网络 + 存储,故障时无法区分根因 |
| 误区:忽略依赖 | 只关注单一资源,不考虑上下游依赖对 SLI 的影响 | 网络延迟升高导致存储 IO 超时,却只告警存储 SLI |
最佳实践: 建议为每类基础设施 SLI 建立独立的 SLO 和目标。例如,计算资源 SLO 为 99.9%,网络资源 SLO 为 99.99%,存储资源 SLO 为 99.95%。不同 SLO 反映了不同资源域的可靠性要求差异。