Prometheus性能优化与问题排查实战指南

存储优化策略

数据保留策略(Retention)

Prometheus默认数据保留时间为15天(通过--storage.tsdb.retention.time参数控制)。对于生产环境,建议根据存储容量和监控需求调整:

# 启动参数示例:保留30天数据
--storage.tsdb.retention.time=30d

实践建议

  • 监控存储目录大小:du -sh /var/lib/prometheus/data
  • 计算公式估算需求:存储需求 = 采样间隔 × 指标数量 × 保留时间 × 平均样本大小

块压缩(Compaction)

Prometheus的TSDB会自动执行压缩:

  1. 每2小时将内存数据写入持久块(Block)
  2. 定期合并小块为大块(降低磁盘IO)

图1

优化建议

  • 确保磁盘有足够IOPS(SSD推荐)
  • 监控prometheus_tsdb_compactions_failed_total告警压缩失败

查询性能优化

避免高基数标签(High Cardinality)

高基数标签会导致存储和查询性能急剧下降:

# 错误示例:将用户ID作为标签会导致基数爆炸
http_requests_total{user_id="123", path="/api"}

解决方案

  1. 使用keep()/drop()过滤不必要标签
  2. 对高基数值进行哈希处理
  3. 通过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个时间序列

常见问题排查

指标丢失问题

  1. 检查目标健康状态

    up{job="my_service"} == 0
  2. 验证抓取配置

    scrape_configs:
      - job_name: 'node'
        scrape_interval: 15s
        scrape_timeout: 10s
        static_configs:
          - targets: ['192.168.1.1:9100']

存储增长过快

  1. 检查高基数指标:

    topk(10, count by(__name__)({__name__=~".+"}))
  2. 使用rate()替代count()避免永久存储计数器值

网络问题诊断

  1. 抓取目标连通性测试

    curl -v http://target:9090/metrics
  2. 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集群在百万级指标规模下保持稳定运行。建议每季度进行一次全面的配置审计和性能评估。

添加新评论