如何估算 Prometheus 的本地存储和内存消耗

2023年 1月 4日 28.9k 0

1. 本地存储容量

所需磁盘大小(GB) = 数据保留时长 * 每秒获取指标数量 * 指标数据大小 / 1024 / 1024 / 1024其中

  • 每秒获取指标数量 rate(prometheus_tsdb_head_samples_appended_total[1d])
  • 一个小时内样本的平均大小 rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d])/rate(prometheus_tsdb_compaction_chunk_samples_sum[1d])

一天(86400 秒)的磁盘消耗,可以在 Prometheus 中直接查询:

86400 * (rate(prometheus_tsdb_head_samples_appended_total[1d]) * (rate(prometheus_tsdb_compaction_chunk_size_bytes_sum[1d]) / rate(prometheus_tsdb_compaction_chunk_samples_sum[1d]))) / 1024 /1024 / 1024

例如,返回 {instance="localhost:9090", job="prometheus"} 4.437027408140867,那么表示 localhost:9090 实例每天需要消耗 4.437 GB 的存储空间。同时,在实例中,有不少于 3 个 wal 文件用于存储原始数据,每个 128 MB。

2. 内存消耗

内存消耗 = Prometheus Server 自身的内存消耗 + 数据块 block 内存消耗 + 抓取指标的内存消耗 + 查询带来的内存消耗

  • Prometheus Server 自身的内存消耗

在刚安装好的多节点高可用集群上,Prometheus Server 的内存消耗为 500 MB 左右。

  • 数据块 block 内存消耗

主要和以下参数相关

- 每秒获取指标数量 rate(prometheus_tsdb_head_samples_appended_total[1d]) 
- 每个指标的平均标签数
- 不同的标签 Pair 总数
- 每个标签 Pair 平均大小
- 数据块 block 落盘周期
  • 抓取指标的内存消耗

主要和以下参数相关

- 每秒获取指标数量 rate(prometheus_tsdb_head_samples_appended_total[1d]) 
- 一个小时内样本的平均大小
- 采集间隔,通常是 15s

在页面 https://www.robustperception.io/how-much-ram-does-prometheus-2-x-need-for-cardinality-and-ingestion/ 可以估算上面两部分。

  • 查询带来的内存消耗

当查询的数据不在内存时,Prometheus 会加载硬盘数据到内存,会有额外的内存消耗。在生产中,通过 avg(container_memory_working_set_bytes{image!="", container="prometheus-server"}) / 1024 /1024 查询的 40 多个集群的平均内存消耗在 953 MB,每个集群平均个 300 Pod。

相关文章

KubeSphere 部署向量数据库 Milvus 实战指南
探索 Kubernetes 持久化存储之 Longhorn 初窥门径
征服 Docker 镜像访问限制!KubeSphere v3.4.1 成功部署全攻略
那些年在 Terraform 上吃到的糖和踩过的坑
无需 Kubernetes 测试 Kubernetes 网络实现
Kubernetes v1.31 中的移除和主要变更

发布评论