我的Prometheus实例具有间歇性的内存峰值,其RSS大小增加了一倍。这将导致它达到k8s中配置的容器限制,并实例化OOM。
它通常位于〜65GB的区域内,这在非常有用的计算器here上是一个不错的选择。将该容器配置为具有120GB的内存限制。
我可以看到process_resident_memory_bytes的峰值与go_memstats_heap_alloc_bytes
的增加相匹配,并且恢复(当它恢复并且没有OOM时)导致go_memstats_heap_released_bytes
的增加,这是因为释放了内存并go_memstats_gc_sys_bytes增加。因此,这是垃圾收集,但是我正在尝试为此找到触发器,以便减轻它。
您可以看到我的基准测试here(链接有效期至20190902):
感谢任何想法或见识!
答案 0 :(得分:0)
很难说出实际发生了什么,但是我遇到的最常见的问题是查询。特别是,如果您采用了其他无害的Grafana仪表板,并将其时间范围更改为过去的-[SCNNode scale]
,则您突然将一切都停止了。过去,这会用OOM杀死Prometheus。现在,它的表现有些好,对每个查询在取消之前将加载的样本数量进行了严格限制,但是通过对它运行任意查询仍然很容易使内存使用量翻倍。这就是为什么我要运行2个实例的想法,并不是出于一般可用性的原因,而是这样一个实例永远不会受到用户查询的影响,并且可以依靠它来发出警报。
话虽如此,最好的选择是去1y
并利用那里可用的概要分析数据的多种选择。最好与http://your.prometheus.server:9090/debug/pprof
之类的东西结合使用。特别是,此命令行可能在内存高峰(与静止时相比)使用时:
go pprof