Prometheus 大内存性能分析及优化

Posted by 白行简 on Saturday, March 10, 2018

整体优化

常见的 Prometheus 性能调优建议:

    1. 内存:
    • 分配足够的内存给Prometheus 实例,以确保它能够容纳监控的指标数据。 Prometheus 使用内存存储时间序列数据,因此内存越大,可以缓存的数据越多, 減少磁盘1/0。
    1. 磁盘:
    • 提供足够的磁盘空间来存储时间序列数据。如果磁盘空间不足,Prometheus 将开 始删除旧的数据,这可能会影响查询的准确性。
    1. 存储块大小:
    • Prometheus 存储数据的方式是将时间序列数据分为块(blocks)。通过调整 ‘storage.tsdb.max-block-duration’ #ll ‘storage.tsdb.min-block-duration’ 参数,可以影响每个块的大小。通常,更大的块可以提高查询性能,但可能会增加 内存使用。
    1. 并发设置:
    • Prometheus 允许调整并发抓取和查询的设置。通过调整‘–web.concurrency、 (查询)和‘–storage.tsdb.max-concurrent-compactions’(压缩) 等参数, 可以适应服务器硬件和负载。
    1. 数据保留期:
    • 考虑清理旧的时间序列数据,以防止数据过度堆积。可以通过设置 storage.tsdb.retention.time‘参数来指定数据保留的时间。
    1. 索引缓存:
    • Prometheus 使用索引缓存来提高查询性能。通过调整‘–storage.tsdb.index- cache-s1ze°参数,可以增加或减少索引缓存的大小。
    1. 抓取频率:
    • 考虑减小抓取频率,尤其是对于稳定的指标。频繁的抓取可能会增加 Prometheus 的负载。
    1. 远程写入存储:
    • 如果 Prometheus 与远程存储一起使用,确保存储系统能够处理高并发写入请求, 并根据存储系统的特性调整相关参数。
https://cairry.github.io/docs/Prometheus/optimization_memory.html

存储需求主要取决于以下几个因素:

随着Prometheus采集的Metrics随之增多,很容易对Prometheus Server造成消耗大内存的现象。

之所以出现大内存,问题来源于它自身存储原理:

Prometheus按2小时(默认)一个block进行存储,每个block由一个目录组成,该目录里包含:
一个或者多个chunk文件(保存timeseries数据)、
一个metadata文件、
一个index文件(通过metric name和labels查找timeseries数据在chunk文件的位置)。 
最新写入的数据保存在内存block中,达到2小时后写入磁盘。
为了防止程序崩溃导致数据丢失,实现了WAL(write-ahead-log)机制,启动时会以写入日志(WAL)的方式来实现重播,从而恢复数据。 删除数据时,删除条目会记录在独立的tombstone文件中,而不是立即从chunk文件删除。

「真诚赞赏,手留余香」

观测猿

真诚赞赏,感谢认可

使用微信扫描二维码完成支付