17.9.2 抓取频率与保留策略优化
2. 抓取频率与保留策略优化#
本节聚焦 Prometheus 抓取频率与保留策略的设计、配置与优化,包含原理草图、完整配置示例、排错与练习。
2.1 原理草图:抓取频率与TSDB保留如何影响资源#
2.2 抓取频率设计原则(含示例)#
- 业务指标分级:核心SLA(成功率、延迟)短间隔;容量/版本长间隔。
- 变更敏感度:QPS、队列堆积短间隔;温度、版本长间隔。
- 成本权衡:间隔越短,样本量与TSDB负载线性增长。
示例:分层抓取间隔
# /etc/prometheus/prometheus.yml
global:
scrape_interval: 30s
evaluation_interval: 30s
scrape_configs:
- job_name: "core-api"
scrape_interval: 10s
static_configs:
- targets: ["10.0.0.11:9100","10.0.0.12:9100"]
- job_name: "edge-metrics"
scrape_interval: 60s
static_configs:
- targets: ["10.0.0.21:9100","10.0.0.22:9100"]
预期效果:核心服务以 10s 抓取,边缘服务以 60s 抓取,降低总体样本量。
2.3 抓取频率优化方法(命令+配置)#
- 按作业拆分:高频与低频指标拆分 job。
- 减小采集范围:过滤冗余指标、降低高基数。
- 动态策略:压测期间调短,结束回收。
示例:丢弃高基数指标
# /etc/prometheus/prometheus.yml
scrape_configs:
- job_name: "k8s-cadvisor"
scrape_interval: 30s
static_configs:
- targets: ["10.0.0.31:9100"]
metric_relabel_configs:
# 丢弃容器层高基数指标
- source_labels: [__name__]
regex: "container_.*"
action: drop
生效方式
# 检查配置
prometheus --config.file=/etc/prometheus/prometheus.yml --check-config
# 平滑重载
curl -X POST http://127.0.0.1:9090/-/reload
2.4 保留策略与存储权衡(含示例)#
- 短期高精度:7–30天用于排障与告警。
- 长期趋势:远程存储降采样保存。
- 合规要求:受审计期限约束。
示例:本地保留与远程写入
# /etc/systemd/system/prometheus.service
[Service]
ExecStart=/usr/local/bin/prometheus \
--config.file=/etc/prometheus/prometheus.yml \
--storage.tsdb.path=/var/lib/prometheus \
--storage.tsdb.retention.time=15d \
--storage.tsdb.retention.size=50GB \
--web.enable-lifecycle
# /etc/prometheus/prometheus.yml
remote_write:
- url: "http://thanos-receiver.monitoring.svc:19291/api/v1/receive"
预期效果:本地保留 15 天或 50GB,长期数据下沉远程存储。
2.5 抓取频率与保留联动计算(命令+示例)#
样本量估算公式
样本量 ≈ 目标数 × 指标数 × 采集频率 × 保留时间
示例:粗估存储需求(PromQL)
# 每秒样本写入速率
rate(prometheus_tsdb_head_samples_appended_total[5m])
容量评估脚本(示意)
#!/usr/bin/env bash
# sample_rate: 每秒样本数
sample_rate=50000
# retention: 秒
retention=$((15*24*3600))
# bytes_per_sample: 约 1-2 bytes 压缩后,粗估 1.5
bytes_per_sample=1.5
total_bytes=$(awk -v r=$sample_rate -v t=$retention -v b=$bytes_per_sample \
'BEGIN{printf "%.0f", r*t*b}')
echo "Estimated bytes: $total_bytes"
预期效果:快速估算 retention 带来的磁盘压力。
2.6 排错与优化建议(含命令)#
1) 抓取耗时过长
# 抓取耗时分位数
histogram_quantile(0.99, sum(rate(scrape_duration_seconds_bucket[5m])) by (le, job))
处理:降低抓取频率、拆分 job、增加 exporter 资源。
2) TSDB 磁盘快速上涨
# TSDB样本写入速率
rate(prometheus_tsdb_head_samples_appended_total[5m])
处理:清理高基数标签或提高 retention.size 告警阈值。
3) 规则评估压力
# 规则评估耗时
rate(prometheus_rule_evaluation_duration_seconds_sum[5m])
/
rate(prometheus_rule_evaluation_duration_seconds_count[5m])
处理:延长 evaluation_interval,优化 PromQL。
2.7 练习#
- 将核心服务抓取间隔从 30s 调整为 10s,验证样本写入速率变化(对比
rate(prometheus_tsdb_head_samples_appended_total[5m]))。 - 为高基数指标添加丢弃规则,观察 TSDB 增长速度。
- 设置 retention.time=7d、retention.size=20GB,验证是否触发历史数据裁剪(检查
prometheus_tsdb_blocks_loaded变化)。
2.8 最佳实践小结#
- 抓取频率分级、作业拆分、指标瘦身是核心优化手段。
- 本地保留不超过 30 天,长期趋势交由远程存储。
- 定期复盘样本写入速率与查询耗时,持续优化成本与性能平衡。