17.8.7 性能与成本权衡的容量估算方法

性能与成本权衡的容量估算方法#

容量估算需要在查询性能、写入吞吐与长期保留成本之间取得平衡。本节以“试运行+公式+监控校准”的方式完成容量模型,并给出可执行的命令、配置、排错与练习。

原理草图:数据量与成本的流向

文章图片

数据量估算公式与关键变量
- 样本量:样本数/秒 = 目标数 × 每目标指标数 × (1/采集周期)
- 日样本量:样本数/天 = 样本数/秒 × 86400
- 存储量估算:存储/天 ≈ 日样本量 × 每样本字节
经验值:原始样本TSDB压缩后约 1–2 字节/样本;含索引元数据 2–4 字节/样本


示例:快速试运行与样本速率采集#

安装/启动(Docker)

# 1) 准备目录
mkdir -p /opt/prometheus/{data,conf}

# 2) 写入最小配置
cat > /opt/prometheus/conf/prometheus.yml <<'EOF'
global:
  scrape_interval: 15s
scrape_configs:
  - job_name: "prometheus"
    static_configs:
      - targets: ["localhost:9090"]
EOF

# 3) 启动 Prometheus
docker run -d --name prometheus \
  -p 9090:9090 \
  -v /opt/prometheus/conf/prometheus.yml:/etc/prometheus/prometheus.yml \
  -v /opt/prometheus/data:/prometheus \
  prom/prometheus:v2.49.1

命令解释
- scrape_interval: 15s:采集周期越短,样本量线性增加。
- /prometheus:TSDB数据目录,容量估算以此为基准。


示例:采集实际样本速率与块大小#

通过 API 获取样本写入速率

# 当前 TSDB 状态
curl -s http://localhost:9090/api/v1/status/tsdb | jq .

关键字段:
- headStats.numSeries:当前时间序列数量
- headStats.chunks:内存中的chunks数量
- headStats.samplesAppended:累计样本数

近1小时写入速率估算(PromQL)

# 1小时内每秒样本追加速率
curl -s "http://localhost:9090/api/v1/query?query=rate(prometheus_tsdb_head_samples_appended_total[1h])" | jq .

预期效果
- 返回 value 为每秒追加样本数,可与公式对比校准“每样本字节”。


示例:容量估算脚本(可执行)#

# /opt/prometheus/capacity_estimate.sh
cat > /opt/prometheus/capacity_estimate.sh <<'EOF'
#!/usr/bin/env bash
# 用法: ./capacity_estimate.sh <targets> <metrics_per_target> <interval_sec> <bytes_per_sample> <retention_days>
targets=$1
mpt=$2
interval=$3
bps=$4
retention=$5

samples_per_sec=$(( targets * mpt / interval ))
samples_per_day=$(( samples_per_sec * 86400 ))
bytes_per_day=$(( samples_per_day * bps ))
bytes_total=$(( bytes_per_day * retention ))

echo "samples/sec: $samples_per_sec"
echo "samples/day: $samples_per_day"
echo "bytes/day : $bytes_per_day"
echo "bytes total($retention d): $bytes_total"
echo "GB total  : $(awk "BEGIN{printf \"%.2f\", $bytes_total/1024/1024/1024}")"
EOF

chmod +x /opt/prometheus/capacity_estimate.sh

# 示例:1000目标, 每目标120指标, 15s采集, 2字节/样本, 保留15天
/opt/prometheus/capacity_estimate.sh 1000 120 15 2 15

命令解释
- bytes_per_sample:初期可取 2(含索引3~4)。
- 输出用于与实际TSDB占用对比。


示例:启用远端存储(Thanos)成本验证#

Prometheus 远端写入示例

# /opt/prometheus/conf/prometheus.yml
remote_write:
  - url: "http://thanos-receive:19291/api/v1/receive"
    queue_config:
      max_samples_per_send: 1000
      capacity: 20000

关键参数说明
- max_samples_per_send:批量发送降低网络开销。
- capacity:缓冲队列,过小会导致丢样本。


成本权衡策略(带操作示例)#

1) 降低基数:过滤高基数标签

# /opt/prometheus/conf/relabel.yml
relabel_configs:
  - source_labels: [request_id]
    action: labeldrop

效果:避免 request_id 导致序列爆炸。

2) 调整采集周期

scrape_configs:
  - job_name: "low_value"
    scrape_interval: 60s

3) 录制规则减少查询成本

# /opt/prometheus/conf/recording.yml
groups:
- name: agg_rules
  rules:
  - record: job:cpu_usage:avg5m
    expr: avg_over_time(node_cpu_seconds_total[5m])

排错清单(容量异常时优先检查)#

  1. 样本数突然升高
curl -s http://localhost:9090/api/v1/query?query=topk(10, prometheus_tsdb_head_series) | jq .
  • 检查高基数标签与新接入目标。
  1. 磁盘暴涨
du -sh /opt/prometheus/data
ls -lh /opt/prometheus/data/*/chunks_head
  • 确认保留时长是否过长、是否启用了远端存储压缩。
  1. 查询变慢
curl -s "http://localhost:9090/api/v1/query?query=prometheus_engine_query_duration_seconds" | jq .
  • 排查高基数聚合、范围查询过大。

练习#

  1. 用脚本估算 500 台节点、每台 150 指标、30s 采集、保留 30 天的容量。
  2. 在 Prometheus 中创建一个高基数标签(如随机UUID),观察 prometheus_tsdb_head_series 增长。
  3. 调整一个 job 的采集周期为 60s,比较 1 小时内 samples_appended 变化。
  4. 添加录制规则后,对比 Grafana 查询耗时。