4.5.4 基线维护、漂移与异常判定

基线建立后需持续维护以反映业务变化、系统升级与环境波动。本节从原理、落地命令、排错与练习给出可执行方法,确保基线口径一致、窗口合理、指标分层清晰。

原理草图(基线维护与异常判定流程):

文章图片

一、安装与数据采集示例(sysstat 作为基础指标采集)

# 1) 安装采集工具
sudo yum install -y sysstat    # RHEL/CentOS
# 或 sudo apt-get install -y sysstat  # Debian/Ubuntu

# 2) 启用周期采集
sudo systemctl enable --now sysstat

# 3) 采集 CPU/负载/IO 等基线数据(10秒间隔,共6次)
sar -u 10 6        # CPU使用率
sar -q 10 6        # 负载与运行队列
sar -d 10 6        # 磁盘IO

二、基线维护示例(按周生成快照并保存版本)

# /opt/baseline/collect_baseline.sh
#!/usr/bin/env bash
set -e
OUT_DIR=/opt/baseline/weekly
mkdir -p "$OUT_DIR"

TS=$(date +%F)
# 采集一小时内的指标均值作为基线样本
sar -u 1 3600 | awk '/Average/ {print "cpu_idle=" $8 ",cpu_user=" $3 ",cpu_sys=" $5}' > "$OUT_DIR/cpu_$TS.txt"
sar -q 1 3600 | awk '/Average/ {print "load1=" $4 ",runq=" $6}' > "$OUT_DIR/load_$TS.txt"
sar -d 1 3600 | awk '/Average/ {print "tps=" $2 ",await=" $10 ",util=" $13}' > "$OUT_DIR/disk_$TS.txt"

echo "baseline_version=$TS" > "$OUT_DIR/version_$TS.txt"

执行并查看:

chmod +x /opt/baseline/collect_baseline.sh
/opt/baseline/collect_baseline.sh
ls -lh /opt/baseline/weekly

三、漂移识别示例(环比/同比对比)

# 计算当前窗口与上周基线的偏移率
# 假设当前窗口 CPU idle=60,上周基线 CPU idle=75
python3 - <<'PY'
curr=60
base=75
drift=(curr-base)/base*100
print(f"cpu_idle_drift={drift:.2f}%")
if drift < -10:
    print("漂移明显:idle下降超过10%,需判断是否业务增长或配置变更。")
PY

四、异常判定示例(静态+动态阈值结合)

# 静态阈值:CPU > 85% 或 IO await > 20ms
sar -u 1 5 | awk 'NR>3 && $3+$5 > 85 {print "CPU高负载告警: ", $0}'
sar -d 1 5 | awk 'NR>3 && $10 > 20 {print "IO等待告警: ", $0}'

# 动态阈值:当前P95超过基线P95的1.5倍
python3 - <<'PY'
curr_p95=320   # ms
base_p95=180   # ms
if curr_p95 > base_p95*1.5:
    print("动态阈值告警:P95超过基线1.5倍")
PY

五、关联判定示例(多指标联动降低误报)

# 关联判断:CPU高 + 负载高 + 运行队列增长
# 假设从 sar 输出取值
python3 - <<'PY'
cpu=90     # %user+%sys
load1=8.2  # 1分钟负载
runq=6     # 运行队列
if cpu>85 and load1>4 and runq>=4:
    print("关联告警:CPU高+负载高+运行队列增长,需排查热点进程")
PY

六、排错建议(漂移与异常分流)
- 漂移可解释:确认业务量增长、发布变更、容量扩容后,更新基线版本并记录变更原因。
- 漂移不可解释:检查最近30天变更记录、硬件异常、内核升级、定时任务变化。
- 异常联动:若 CPU 高但负载低,优先排查单线程热点或 cgroup 限制;若 IO await 高但 tps 低,排查存储抖动或队列拥塞。
- 基线口径错乱:检查指标采集周期、时间窗口、单位(ms/µs)是否一致。

七、练习
1) 用 sysstat 采集一小时数据,生成本周 CPU/负载/IO 基线文件。
2) 人为制造负载(例如 stress-ng --cpu 2 --timeout 60s),计算与基线的偏移率并判断漂移/异常。
3) 设置静态阈值告警与动态阈值告警各一条,并解释两者优缺点。