我们的K8s吊舱上有OOMKilled活动。我们希望在这样的事件的情况下,在pod被驱逐之前运行本机内存分析命令。是否可以添加这样的钩子?
更具体:我们使用-XX:NativeMemoryTracking=summary
JVM标志运行。我们希望在移除pod之前运行jcmd <pid> VM.native_memory summary.diff
以查看导致OOM的原因。
答案 0 :(得分:8)
看起来几乎不可能处理。
基于answer on Github关于优雅停止OMM Kill:
目前无法更改OOM行为。当容器接近其内存限制时,Kubernetes(或运行时)可以为容器提供信号。尽管因为内存峰值可能无法按时处理,但这将是尽力而为的。
如果节点在kubelet能够回收内存之前遇到系统OOM(内存不足)事件,则该节点依赖于oom_killer进行响应。 kubelet根据Pod的服务质量为每个容器设置oom_score_adj值。
所以,正如你所理解的那样,你没有太多机会以某种方式处理它。 这是关于OOM处理的大article,我将在这里只涉及一小部分关于内存控制器的内存处理:
不幸的是,这个过程可能没有太多其他方法来响应OOM情况。如果它已使用mlock()或mlockall()将其文本锁定到内存中,或者它已经驻留在内存中,则它现在知道内存控制器内存不足。但是,它无法做任何其他事情,因为大多数感兴趣的操作都需要分配更多内存。
我唯一可以提供的是从cAdvisor获取数据(这里可以获得OOM Killer事件)或者从Kubernetes API获取数据并在您看到非常接近的指标时运行您的命令记忆。在你获得OOM杀手事件之后,我不确定你是否有时间做某事。