Prometheus性能优化与问题排查实战指南
Prometheus性能优化与问题排查实战指南
存储优化策略
数据保留策略(Retention)
Prometheus默认数据保留时间为15天(通过--storage.tsdb.retention.time
参数控制)。对于生产环境,建议根据存储容量和监控需求调整:
# 启动参数示例:保留30天数据
--storage.tsdb.retention.time=30d
实践建议:
- 监控存储目录大小:
du -sh /var/lib/prometheus/data
- 计算公式估算需求:
存储需求 = 采样间隔 × 指标数量 × 保留时间 × 平均样本大小
块压缩(Compaction)
Prometheus的TSDB会自动执行压缩:
- 每2小时将内存数据写入持久块(Block)
- 定期合并小块为大块(降低磁盘IO)
优化建议:
- 确保磁盘有足够IOPS(SSD推荐)
- 监控
prometheus_tsdb_compactions_failed_total
告警压缩失败
查询性能优化
避免高基数标签(High Cardinality)
高基数标签会导致存储和查询性能急剧下降:
# 错误示例:将用户ID作为标签会导致基数爆炸
http_requests_total{user_id="123", path="/api"}
解决方案:
- 使用
keep()
/drop()
过滤不必要标签 - 对高基数值进行哈希处理
- 通过Recording Rules预先聚合
Recording Rules实战
在prometheus.yml
中定义:
rule_files:
- 'recording_rules.yml'
示例规则文件内容:
groups:
- name: example
rules:
- record: job:http_inprogress_requests:sum
expr: sum by(job) (http_inprogress_requests)
效果:
- 原始查询需要实时计算1000+时间序列
- 预聚合后只需查询1个时间序列
常见问题排查
指标丢失问题
检查目标健康状态:
up{job="my_service"} == 0
验证抓取配置:
scrape_configs: - job_name: 'node' scrape_interval: 15s scrape_timeout: 10s static_configs: - targets: ['192.168.1.1:9100']
存储增长过快
检查高基数指标:
topk(10, count by(__name__)({__name__=~".+"}))
- 使用
rate()
替代count()
避免永久存储计数器值
网络问题诊断
抓取目标连通性测试:
curl -v http://target:9090/metrics
DNS解析检查:
scrape_configs: - job_name: 'service' dns_sd_configs: - names: ['_prometheus._tcp.example.com']
性能优化检查清单
类别 | 检查项 | 推荐值 |
---|---|---|
存储 | 保留时间设置 | 15-90天 |
块压缩成功率 | >99% | |
查询 | 高基数标签数量 | <10,000/指标 |
Recording Rules覆盖率 | >80%高频查询 | |
网络 | 抓取超时时间 | <scrape_interval/2 |
关键指标监控:
prometheus_target_skipped_scrapes_total
(跳过的抓取)prometheus_tsdb_head_series
(内存中的序列数)process_resident_memory_bytes
(内存使用量)
通过以上优化措施,可使Prometheus集群在百万级指标规模下保持稳定运行。建议每季度进行一次全面的配置审计和性能评估。