17.9.4 查询性能与规则评估负载控制

查询性能与规则评估负载控制重点在于限制高代价查询、优化规则评估周期与并发、降低瞬时峰值。通过合理的查询习惯、规则拆分与缓存策略,保证 Prometheus 在高基数与高频抓取场景下保持稳定。以下给出原理草图、配置示例、命令与排错方法。

原理草图:查询与规则评估负载路径

文章图片

查询性能优化要点与示例
- 避免高基数正则与 label_replace,优先聚合后再筛选。
- 控制时间范围与分辨率;Grafana 使用 min_intervalmax_data_points
- 使用录制规则缓存高成本计算结果。

示例:高代价与优化查询对比

# 高代价:高基数 + 正则
sum(rate(http_requests_total{pod=~".*"}[5m])) by (pod)

# 优化:先聚合,再限定标签
sum(rate(http_requests_total{namespace="prod"}[5m])) by (app)

Grafana 面板建议设置(示例说明)
- min_interval: 30s
- max_data_points: 1000
效果:减少一次查询的样本数量,降低引擎负载。

规则评估负载控制与配置示例
- 规则组分层:按业务域与重要性拆分。
- 高代价规则设置更长周期。
- 拆分复杂规则为多条 Recording Rules。

示例文件:/etc/prometheus/rules/app.rules.yml

groups:
- name: app_core_fast
  interval: 30s
  rules:
  - record: job:http_requests:rate5m
    expr: sum(rate(http_requests_total{job="api"}[5m])) by (job)

- name: app_heavy_slow
  interval: 5m
  rules:
  - record: job:http_error_ratio:5m
    expr: |
      sum(rate(http_requests_total{job="api",code=~"5.."}[5m]))
      /
      sum(rate(http_requests_total{job="api"}[5m]))

Prometheus 主配置加载规则(/etc/prometheus/prometheus.yml

rule_files:
  - /etc/prometheus/rules/*.yml

关键命令与解释(安装/验证/热加载)
1) 验证规则语法并预期输出 OK

promtool check rules /etc/prometheus/rules/app.rules.yml
# 预期输出:SUCCESS: 0 rule files found to be invalid

2) 验证主配置

promtool check config /etc/prometheus/prometheus.yml
# 预期输出:SUCCESS: 1 rule files found

3) 热加载 Prometheus 配置

curl -X POST http://127.0.0.1:9090/-/reload
# 预期输出:HTTP/1.1 200 OK

查询限流与并发控制(启动参数示例)

# /etc/systemd/system/prometheus.service.d/override.conf
[Service]
ExecStart=
ExecStart=/usr/local/bin/prometheus \
  --config.file=/etc/prometheus/prometheus.yml \
  --storage.tsdb.path=/var/lib/prometheus \
  --query.max-concurrency=20 \
  --query.timeout=2m \
  --query.max-samples=50000000

参数说明:
- --query.max-concurrency:限制并发查询数
- --query.timeout:查询超时控制
- --query.max-samples:单次查询最大样本数

重载 systemd

systemctl daemon-reload
systemctl restart prometheus

排错与诊断
1) 查询慢或超时:查看引擎耗时

curl -s http://127.0.0.1:9090/api/v1/query \
  --data-urlencode 'query=prometheus_engine_query_duration_seconds' | head

重点关注 p99/p95 延迟是否陡增。

2) 规则评估超时:检查评估耗时与失败

curl -s http://127.0.0.1:9090/api/v1/query \
  --data-urlencode 'query=prometheus_rule_evaluation_duration_seconds' | head

3) 规则没生效:确认规则加载状态

curl -s http://127.0.0.1:9090/api/v1/rules | head
# 预期:rules 列表中包含 app_core_fast 与 app_heavy_slow

实践建议
- 为核心仪表盘建立 Recording Rules 预计算指标,减少实时计算压力。
- 高代价告警设置 for 时间窗,降低抖动与频繁评估。
- 监控自身指标:prometheus_engine_query_duration_secondsprometheus_rule_evaluation_duration_secondsprometheus_tsdb_head_series,评估负载变化。
- 在高峰期通过权限与限流保障关键告警优先级。

练习
1) 将一条高代价查询拆分为两条 Recording Rules,并比较查询耗时。
2) 设置 --query.max-concurrency=5,在并发查询 20 次时观察错误与延迟。
3) 将规则组 interval 从 30s 改为 5m,验证 CPU 使用率变化。