我想找出并了解OOM杀手是如何在容器上工作的。
为了解决这个问题,我读了很多文章,发现OOM杀手杀死了基于oom_score的容器。oom_score是由oom_score_adj和该进程的内存使用情况决定的。
还有两个度量标准container_memory_working_set_bytes,container_memory_rss来自cAdvisor,用于监视容器的内存使用情况。
RSS (container_memory_rss)似乎对oom_score有影响,因此我可以理解,使用container_memory_rss度量,如果该度量达到内存限制,OOM杀手将杀死进程。
但从下面的文章中可以看出:
更好的衡量标准是
container_memory_working_set_bytes,因为这正是OOM杀手所关注的。
我无法理解OOM杀手正在监视容器的工作集内存,,我想我不理解容器上工作集内存的含义,它是“总使用-非活动文件”。
我在哪里能找到推荐信?或者你能解释一下工作集内存和容器上的OOM-杀手之间的关系吗?
发布于 2021-03-29 09:10:47
您已经知道,container_memory_working_set_bytes是:
工作集内存量,包括最近访问的内存、脏内存和内核内存。因此,工作集是
container_memory_working_set_bytes被用于OoM决策,因为排除了缓存的数据 (Linux页面缓存),这些数据在内存压力情况下可以被逐出。
因此,如果container_memory_working_set_bytes增加到极限,就会导致oomkill。
您可以发现,当Linux内核检查可用内存时,它会调用vm_enough_memory()来查找可能可用的页面数。
然后,当机器内存不足时,旧的页面帧(包括缓存)将被回收,但是内核仍然会发现它无法释放足够多的页面来满足请求。现在是时候调用out_of_memory()来终止这个进程了。为了确定要终止的候选进程,它使用oom_score。
因此,当工作集字节达到极限时,这意味着即使在回收旧页(包括缓存)之后,内核也找不到可用的页面,因此内核将触发OOM杀手来杀死进程。
您可以找到关于Linux内核文档的更多细节:
https://stackoverflow.com/questions/66832316
复制相似问题