17.9.5 资源配额与扩容规划实践
在Prometheus资源配额与扩容规划实践中,应以实际负载为基准,从CPU、内存、磁盘IO和网络四个维度制定配额与扩容策略,确保采集、存储与查询在高峰期稳定运行。
原理草图:资源消耗与扩容路径
资源配额制定方法#
- CPU:抓取、压缩、规则评估与查询为主要消耗点。建议预留30%冗余。
- 内存:WAL缓存、TSDB索引与查询缓存为主;活跃序列越多,内存需求越高。
- 磁盘:保留周期与写入速率决定容量;建议SSD。
- 网络:抓取与远程写入的出入带宽需与目标端匹配。
指标与容量估算示例(PromQL)#
# 样本写入速率(samples/s)
rate(prometheus_tsdb_head_samples_appended_total[5m])
# 活跃时间序列规模
prometheus_tsdb_head_series
# WAL写入压力
rate(prometheus_tsdb_wal_fsync_duration_seconds_sum[5m])
容量估算命令示例(Linux)#
# 估算当前TSDB目录大小与增长趋势
du -sh /var/lib/prometheus
df -h /var/lib/prometheus
# 观察Prometheus进程资源
ps -o pid,cmd,%cpu,%mem -C prometheus
容量规划流程(可执行示例)#
- 统计当前活跃序列、样本写入速率与保留周期。
- 计算日增量与总容量需求(可估算压缩比)。
- 评估CPU、内存基线,校验查询高峰与规则评估开销。
- 进行压力测试,形成扩容触发阈值。
简易估算脚本(样本写入速率 → 日增量)#
#!/usr/bin/env bash
# 文件: /opt/prometheus/estimate.sh
# 说明: 通过Prometheus API查询写入速率估算日数据量
PROM_URL="http://127.0.0.1:9090"
RATE=$(curl -s "${PROM_URL}/api/v1/query?query=rate(prometheus_tsdb_head_samples_appended_total[5m])" \
| jq -r '.data.result[0].value[1]')
# 假设每样本平均1.5字节压缩后(示例值)
BYTES_PER_SAMPLE=1.5
DAY_BYTES=$(echo "$RATE * 86400 * $BYTES_PER_SAMPLE" | bc)
echo "estimated_day_bytes=${DAY_BYTES}"
预期效果:输出estimated_day_bytes=xxxx,用于粗略评估日增量。
扩容策略与配置示例#
- 纵向扩容:提升CPU与内存,用于缓解查询与规则评估压力。
- 横向扩容:分片或联邦,将目标与规则分摊到多个实例。
- 远程存储:历史数据迁移至长期存储,减轻本地TSDB压力。
Prometheus配置(远程写入与保留周期)#
# 文件: /etc/prometheus/prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
storage:
tsdb:
retention_time: 15d
remote_write:
- url: "http://thanos-receive:19291/api/v1/receive"
queue_config:
max_shards: 8
capacity: 5000
预期效果:本地保留15天数据,同时写入远程存储。
分片抓取(示例:两实例分摊目标)#
# Prometheus-A: 只抓取以 -a 结尾的job
scrape_configs:
- job_name: 'node-a'
static_configs:
- targets: ['10.0.0.1:9100','10.0.0.2:9100']
# Prometheus-B: 只抓取以 -b 结尾的job
scrape_configs:
- job_name: 'node-b'
static_configs:
- targets: ['10.0.1.1:9100','10.0.1.2:9100']
K8s资源配额示例(Request/Limit)#
# 文件: prometheus-deploy.yaml
resources:
requests:
cpu: "2"
memory: "4Gi"
limits:
cpu: "4"
memory: "8Gi"
预期效果:避免抢占导致的抖动,保证稳定抓取与查询。
排错与验证#
常见问题:
- 查询慢:检查查询并发、规则评估和高基数指标。
- WAL膨胀:检查远程写入阻塞与磁盘IO。
- OOM:活跃序列过高或内存限制过小。
排错命令:
# Prometheus进程内存峰值
ps -o pid,cmd,%mem,rss -C prometheus
# 查看WAL与TSDB目录情况
ls -lh /var/lib/prometheus/wal
ls -lh /var/lib/prometheus/blocks
# 观察规则评估耗时
curl -s http://127.0.0.1:9090/metrics | grep prometheus_rule_evaluation_duration_seconds
练习#
- 用PromQL获取
prometheus_tsdb_head_series并估算内存需求(假设每序列占用2KB)。 - 将本地保留周期从30d调整为15d,观察磁盘变化。
- 在两台Prometheus上进行分片抓取,并对比CPU与查询延迟变化。
- 模拟远程写入阻塞,观察WAL增长与磁盘占用变化。