Prometheus 理解普罗米修斯的记忆使用峰值

Prometheus 理解普罗米修斯的记忆使用峰值,prometheus,Prometheus,我的普罗米修斯实例有间歇性的内存峰值,这是它的RSS大小的两倍。这会导致它达到k8s中配置的容器限制并打开实例 它通常位于~65GB的区域,这是非常有用的计算器的一大特点。容器配置为120GB内存限制 我可以看到进程驻留内存字节的峰值与go\u memstats\u heap\u alloc\u字节的增加相匹配,而恢复(当它恢复并且没有OOM时)会导致go\u memstats\u heap\u released\u字节的增加,因为内存被释放,而go\u memstats\u gc\u sys\

我的普罗米修斯实例有间歇性的内存峰值,这是它的RSS大小的两倍。这会导致它达到k8s中配置的容器限制并打开实例

它通常位于~65GB的区域,这是非常有用的计算器的一大特点。容器配置为120GB内存限制

我可以看到进程驻留内存字节的峰值与
go\u memstats\u heap\u alloc\u字节的增加相匹配,而恢复(当它恢复并且没有OOM时)会导致
go\u memstats\u heap\u released\u字节的增加,因为内存被释放,而go\u memstats\u gc\u sys\u字节的增加。所以这是垃圾收集,但我正试图找到触发它的原因,这样我就可以减轻它

您可以看到我的基准测试的样子(链接有效期至201902):


任何想法或见解都值得赞赏

很难说到底发生了什么,但我遇到的最常见的问题是查询。特别是,如果您使用一个本来无害的Grafana仪表板,并将其时间范围更改为过去的
1y
,您会突然停止一切。过去人们认为这会让普罗米修斯丧命。现在,它的性能有所提高,在取消查询之前对每个查询将加载的样本数进行了严格限制,但通过对其运行任意查询,仍然很容易将内存使用量增加一倍。这就是为什么我在考虑运行2个实例的原因,不是出于通用性的原因,而是为了让一个实例永远不会被用户查询击中,并且可以依赖它来发出警报

也就是说,您最好的选择是转到
http://your.prometheus.server:9090/debug/pprof
,并利用这里提供的大量分析数据。理想情况下,与类似于
go-pprof
的东西结合使用。特别是,当内存尖峰正在进行时(与静止时获得的尖峰相比较),此命令行可能有用:


感谢您抽出时间阅读并回答!我已经运行了10个并发查询限制,每个查询的默认样本限制为50m,但我看不到活动查询与峰值时间相关。和您一样,我正在将摄取/警报与仪表板查询分离,但在扩展方面也存在问题。Brian's最近的一个博客建议,替代解决方案比次要的prometheus更适合扩展:堆转储看起来可以提供一些见解-下次看到峰值时,我会抓住这个机会。我现在有了一个在峰值时捕获堆的go工具。我将尝试让svg托管以共享。这大约是来自HTTP API的1/3摄取、1/3远程写入、1/5活动查询(可能是在
ExpandPostings
中的高基数),其余的是TSDB。根据这些图表,我认为有人向您发送了一个很重的查询范围查询,而内存计算并没有完全涵盖这一点。我想知道查询的选择器是什么样子的。仅供参考,在最新的普罗米修斯版本()中,您应该能够在一些日志文件中看到当前正在进行的所有查询。(还没试过,所以我不知道是哪个文件。这是。)下次你看到钉子的时候也可以检查一下。
go pprof http://your.prometheus.server:9090/debug/pprof/heap