4.5.3 基线建立方法与数据采集
在运维实践中,建立性能基线的目标是形成“正常态”的量化标准,为异常判定、容量评估与优化提供参照。本节聚焦基线建立方法与数据采集,涵盖基线类型、采集策略、指标粒度与时间窗口等关键要点。
基线建立方法#
1. 统计基线(经验基线)
通过历史监控数据提取统计特征,如均值、95/99分位数、标准差等,形成稳定区间。适用于业务负载相对稳定的系统。
示例:使用 PromQL 计算 CPU 使用率 95 分位
quantile_over_time(0.95, 100 - avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[1m]))[7d:])
2. 周期基线(业务基线)
按业务周期划分,如工作日/周末、白天/夜间、活动期/非活动期,分别建立基线。适用于存在明显流量波动的系统。
示例:对工作日 09:00-18:00 计算 QPS 均值
avg_over_time(http_requests_total[1h])
3. 资源基线(容量基线)
以资源使用上限为基准,如CPU持续使用率不超过70%、内存可用率不低于20%、磁盘IO等待不超过10%。适用于容量规划与阈值告警设置。
示例:CPU 长期 >70% 判定
avg_over_time(100 - avg by (instance)(rate(node_cpu_seconds_total{mode="idle"}[1m]))[30m]) > 70
4. 服务基线(SLA基线)
基于业务服务指标建立,如接口P95响应时间、错误率、吞吐量等,与业务SLA对齐,适用于应用层性能基线。
示例:接口 P95 响应时间
histogram_quantile(0.95, sum by (le)(rate(http_request_duration_seconds_bucket[5m])))
5. 组合基线(多维基线)
结合多指标联动,构建基线画像,例如“CPU 60% + IO等待 <5% + QPS < 2k”的组合条件,用于更精准的异常识别。
示例:PromQL 多条件告警规则
# /etc/prometheus/rules/baseline.yml
groups:
- name: baseline
rules:
- alert: BaselineDrift
expr: (avg_over_time(100 - avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))[10m]) > 60)
and (avg_over_time(rate(node_disk_io_time_seconds_total[1m])[10m]) < 0.05)
and (avg_over_time(http_requests_total[1m])[10m] < 2000)
for: 10m
labels:
severity: warning
annotations:
summary: "组合基线漂移"
数据采集策略#
1. 采集范围
覆盖系统、服务与业务三层指标,形成闭环:
- 系统层:CPU、内存、磁盘、网络
- 服务层:进程数、句柄数、线程数、队列长度
- 业务层:QPS、响应时间、错误率、吞吐量
2. 采集粒度
常用粒度为1s/5s/10s/1min,粒度越细越利于分析短时抖动,但存储成本更高。基线建议以1min为主,关键服务可保留秒级数据。
3. 采集窗口
建议至少覆盖一个完整业务周期(7天或30天),以保障基线准确性。窗口过短易造成误判。
4. 冷热数据分层
- 热数据(近7天):用于实时分析与告警
- 温数据(30天):用于周期基线与趋势分析
- 冷数据(90天以上):用于容量演进与版本对比
5. 数据清洗与异常剔除
建立基线前需剔除异常点(如故障、扩容、压测期间),避免污染基线。可通过异常检测或人工标记实现。
数据采集工具与指标来源#
1. 系统指标
- /proc、/sys:原生指标
- top、vmstat、iostat、sar、pidstat
- 采集工具:node_exporter、collectd
2. 服务指标
- 进程级:ps, lsof, pmap, ss
- 应用层:自定义指标、JMX、Exporter
3. 业务指标
- 服务日志(Nginx/应用日志)
- 监控平台自定义埋点
- 接口调用指标(APM、链路追踪)
安装与采集示例(node_exporter + Prometheus)#
1. 安装 node_exporter(Linux x86_64)
# 下载安装
curl -LO https://github.com/prometheus/node_exporter/releases/download/v1.7.0/node_exporter-1.7.0.linux-amd64.tar.gz
tar -xf node_exporter-1.7.0.linux-amd64.tar.gz
sudo mv node_exporter-1.7.0.linux-amd64/node_exporter /usr/local/bin/
# 创建systemd服务
sudo tee /etc/systemd/system/node_exporter.service >/dev/null <<'EOF'
[Unit]
Description=Prometheus Node Exporter
After=network.target
[Service]
ExecStart=/usr/local/bin/node_exporter
Restart=always
User=nobody
[Install]
WantedBy=multi-user.target
EOF
sudo systemctl daemon-reload
sudo systemctl enable --now node_exporter
sudo systemctl status node_exporter --no-pager
预期效果:http://<host>:9100/metrics 可访问并返回指标。
2. Prometheus 采集配置
# /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: 'node'
scrape_interval: 15s
static_configs:
- targets: ['192.168.1.10:9100']
解释:scrape_interval 控制采集粒度,建议与基线粒度一致或更细。
3. 基线数据导出(Prometheus HTTP API)
# 拉取过去7天CPU使用率数据
END=$(date +%s)
START=$((END-7*24*3600))
curl -G 'http://prometheus:9090/api/v1/query_range' \
--data-urlencode 'query=100-avg(rate(node_cpu_seconds_total{mode="idle"}[1m]))' \
--data-urlencode "start=${START}" \
--data-urlencode "end=${END}" \
--data-urlencode "step=60"
预期效果:返回 JSON 时间序列,可用于离线计算均值/分位数。
命令级数据采集示例(离线基线)#
1. 使用 sar 持续采样并保存
# 安装
sudo yum -y install sysstat || sudo apt -y install sysstat
# 启动并配置收集周期(每10秒采集一次)
sudo sed -i 's/INTERVAL=.*/INTERVAL=10/' /etc/sysconfig/sysstat 2>/dev/null || true
sudo systemctl enable --now sysstat
# 查看CPU历史
sar -u -f /var/log/sa/sa$(date +%d)
解释:sar -u 输出CPU利用率,-f 指定历史文件。
2. 使用 vmstat 快速判断抖动
# 每5秒采集一次,共12次
vmstat 5 12
解释:r 代表就绪队列,wa 为IO等待,用于判断CPU/IO压力。
排错与常见问题#
- 无法访问 9100 端口:检查防火墙与安全组
bash sudo ss -lntp | grep 9100 sudo firewall-cmd --add-port=9100/tcp --permanent && sudo firewall-cmd --reload - Prometheus 无数据:核对 targets 状态与时间同步
bash curl -s http://prometheus:9090/api/v1/targets | jq '.data.activeTargets[].health' timedatectl status - 基线漂移异常:排查是否发生扩容/压测
bash grep -i 'scale\|deploy\|stress' /var/log/messages
基线建立的实践建议#
- 明确系统稳定期后再建立基线
- 基线与版本迭代同步更新
- 保留基线模型配置与计算规则
- 基线应支持多维对比(时间、主机、实例)
练习#
- 使用
sar采集一天CPU与IO数据,计算CPU idle均值与IO等待95分位。 - 部署
node_exporter与prometheus,在 PromQL 中计算过去7天内存使用率的 P95。 - 模拟压测(如
stress)并观察基线漂移,记录异常识别的触发条件。