Memory 为什么普罗米修斯要消耗这么多的记忆?

Memory 为什么普罗米修斯要消耗这么多的记忆?,memory,prometheus,Memory,Prometheus,我正在使用Prometheus 2.9.2监控节点的大型环境。 作为在我们的环境中测试普罗米修斯最大规模的一部分,我在我们的测试环境中模拟了大量指标 我的管理服务器有16GB ram和100GB磁盘空间 在规模测试期间,我注意到Prometheus进程会消耗越来越多的内存,直到进程崩溃 我注意到,当普罗米修斯的内存使用率上升时,WAL目录中很快就充满了大量的数据文件 管理服务器每15秒刮取一次节点,并且存储参数都设置为默认值 我想知道为什么会发生这种情况,以及如何/如果有可能防止进程崩溃 谢谢大

我正在使用Prometheus 2.9.2监控节点的大型环境。 作为在我们的环境中测试普罗米修斯最大规模的一部分,我在我们的测试环境中模拟了大量指标

我的管理服务器有16GB ram和100GB磁盘空间

在规模测试期间,我注意到Prometheus进程会消耗越来越多的内存,直到进程崩溃

我注意到,当普罗米修斯的内存使用率上升时,WAL目录中很快就充满了大量的数据文件

管理服务器每15秒刮取一次节点,并且存储参数都设置为默认值

我想知道为什么会发生这种情况,以及如何/如果有可能防止进程崩溃


谢谢大家!

内存不足崩溃通常是过度繁重的查询造成的。这可能在您的一条规则中设置。(这条规则甚至可能运行在grafana页面上,而不是普罗米修斯本身)


如果您有大量度量,则规则可能会查询所有度量。快速修复方法是使用特定标签而不是正则表达式精确指定要查询的指标。

因为标签的组合取决于您的业务,组合和块可能是无限的,因此无法解决普罗米修斯当前设计的内存问题!!!!但是我建议你把小的块压缩成大的块,这样可以减少块的数量

巨大的内存消耗有两个原因:

  • 普罗米修斯tsdb有一个名为“head”的内存块,因为head存储最近几个小时内的所有序列,它会消耗大量内存
  • 磁盘上的每个块也会消耗内存,因为磁盘上的每个块在内存中都有一个索引读取器,令人沮丧的是,一个块的所有标签、日志和符号都缓存在索引读取器结构中,磁盘上的块越多,占用的内存就越多
  • 在index/index.go中,您将看到:

    type Reader struct {
        b ByteSlice
    
        // Close that releases the underlying resources of the byte slice.
        c io.Closer
    
        // Cached hashmaps of section offsets.
        labels map[string]uint64
        // LabelName to LabelValue to offset map.
        postings map[string]map[string]uint64
        // Cache of read symbols. Strings that are returned when reading from the
        // block are always backed by true strings held in here rather than
        // strings that are backed by byte slices from the mmap'd index file. This
        // prevents memory faults when applications work with read symbols after
        // the block has been unmapped. The older format has sparse indexes so a map
        // must be used, but the new format is not so we can use a slice.
        symbolsV1        map[uint32]string
        symbolsV2        []string
        symbolsTableSize uint64
    
        dec *Decoder
    
        version int
    }
    

    我们使用的是普罗米修斯2.19版,我们的内存性能明显更好。我强烈建议您使用它来提高实例资源消耗。

    解释了普罗米修斯在数据摄取期间可能会使用大量内存的原因。如果您需要减少普罗米修斯的内存使用,那么以下操作将有所帮助:

    • 在中增加
      scrape_间隔
    • 减少刮取目标的数量和/或每个目标的刮取指标

    另外,请看一下我所从事的项目-。与普罗米修斯相比,它可以使用更少的内存。有关详细信息,请参阅。

    您可以通过删除“/metrics”端点来监视普罗米修斯。我会给你一些有用的指标。此外,普罗米修斯有一系列的请求处理程序,它们公开了CPU使用率、内存使用率、自启动以来的总内存分配等分析信息。你可以在
    http://your.prometheus.host:9090/debug/pprof
    。因此,如果您安装了
    go
    ,您只需使用
    go-pprof即可http://your.prometheus.host:9090/debug/pprof/heap
    然后输入
    web
    ,并在出现的命令行提示符中单击enter键。否则,您可以从(或通过安装Golang)获得
    pprof
    。请明确这些链接中哪些指向您自己的博客和项目。