4. 基线定义与度量:系统基线、KPI/SLI 选取与阈值设定
在混沌工程实践中,系统基线是衡量系统健康状态的“标尺”。没有基线,混沌实验就失去了判断成功或失败的依据。本章将深入讲解如何定义基线、选取关键指标以及设定合理的阈值。
4.1 什么是系统基线
系统基线是指在正常生产负载下,系统各项可观测指标所呈现的稳定状态范围。它不是一个单一数值,而是一个包含时间窗口、统计分布和业务上下文的动态参考系。
核心观点: 基线不是“理想值”,而是“正常值”。混沌实验的目标是验证系统在故障注入后,能否恢复到基线范围内,而非追求零故障。
基线的建立通常包含以下三个步骤:
- 数据采集: 在无故障的“黄金时段”内,收集系统各层级的指标数据(如 CPU、内存、延迟、错误率)。
- 统计分析: 计算指标的均值、P50、P95、P99 分位数以及标准差,形成分布模型。
- 动态更新: 基线应随业务周期(如大促、版本发布)自动调整,避免使用过时的静态数据。
4.2 关键性能指标(KPI)与服务水平指标(SLI)的选取
KPI 和 SLI 是基线定义的核心。KPI 偏向业务视角,SLI 偏向技术视角。两者需要协同选取,才能全面反映系统状态。
4.2.1 KPI 与 SLI 的区别
| 维度 | KPI(关键性能指标) | SLI(服务水平指标) |
|---|---|---|
| 关注点 | 业务价值与用户体验 | 技术系统内部状态 |
| 示例 | 订单成功率、支付转化率、页面加载时间 | 请求延迟 P99、错误率、CPU 使用率 |
| 受众 | 产品经理、业务方、管理层 | 开发、运维、SRE 工程师 |
| 混沌实验用途 | 判断故障是否影响业务 | 判断故障是否影响系统稳定性 |
4.2.2 选取原则
- 可观测性: 指标必须能被持续采集,且采集成本可控。
- 可量化: 避免主观描述,使用具体数值或比率。
- 业务关联: 优先选取与用户直接体验相关的指标(如登录耗时、下单成功率)。
- 覆盖全链路: 至少包含基础设施层、中间件层、应用层和业务层各一个指标。
实践建议: 对于混沌实验,建议选取 3~5 个核心 SLI 作为“黄金指标”。例如:延迟(Latency)、流量(Traffic)、错误(Errors)、饱和度(Saturation)——即 Google SRE 提出的“USE 方法”扩展。
4.3 基线阈值设定方法
阈值是基线的“警戒线”。设定过严会导致误报,过松则无法发现真实问题。以下是三种常用的阈值设定方法。
4.3.1 方法对比
| 方法 | 原理 | 适用场景 | 优点 | 缺点 |
|---|---|---|---|---|
| 固定阈值 | 根据经验或 SLA 设定固定数值 | 延迟、错误率等稳定指标 | 简单直观,易于理解 | 无法适应业务波动 |
| 动态阈值(3σ) | 基于历史数据的均值 ± 3 倍标准差 | CPU、内存等周期性指标 | 自动适应负载变化 | 对突发噪音敏感 |
| 分位数阈值 | 设定 P95 或 P99 作为上限 | 延迟分布不均匀的场景 | 排除极端值干扰 | 需要较大数据样本 |
4.3.2 动态阈值计算示例(Python)
import numpy as np
def calculate_dynamic_threshold(metric_values, multiplier=3):
"""
基于 3σ 原则计算动态阈值
:param metric_values: 历史指标数据列表
:param multiplier: 标准差倍数,默认 3
:return: (下限, 上限)
"""
mean = np.mean(metric_values)
std = np.std(metric_values)
lower = mean - multiplier * std
upper = mean + multiplier * std
return round(lower, 2), round(upper, 2)
# 示例:CPU 使用率历史数据
cpu_data = [45.2, 48.1, 50.3, 47.8, 52.0, 46.5, 49.9]
low, high = calculate_dynamic_threshold(cpu_data)
print(f"CPU 基线范围: {low}% ~ {high}%")
# 输出: CPU 基线范围: 40.12% ~ 56.68%
4.4 基线核验流程
在混沌实验中,基线核验分为实验前、实验中、实验后三个阶段:
- 实验前: 确认当前系统指标是否在基线范围内。若已偏离基线,则需先排查问题,不执行实验。
- 实验中: 持续监控指标变化,记录偏离基线的幅度和持续时间。
- 实验后: 验证系统是否自动恢复到基线范围内。若无法恢复,则实验失败,需触发告警或回滚。
常见误区: 不要将基线阈值设定为“固定死线”。例如,将 CPU 使用率阈值设为 80%,但业务高峰期正常值就是 85%,此时应使用动态阈值或分位数阈值来避免误报。