“container_memory_working_set_bytes”指标与容器中的OOM-killer有什么关系?

7

我正在尝试了解和理解OOM-killer在容器中的工作方式。

为了弄清楚这一点,我阅读了很多文章,发现OOM-killer基于oom_score来杀死容器进程。而oom_score是由oom_score_adj和该进程的内存使用量决定的。

cAdvisor提供了两个指标container_memory_working_set_bytescontainer_memory_rss用于监视容器的内存使用情况。

看起来RSS内存(container_memory_rss)对oom_score有影响,因此我可以理解,如果该指标达到内存限制,OOM-killer将会杀死进程。

但是从以下文章中得知:

更好的指标是container_memory_working_set_bytes,因为这是OOM-killer正在监视的。

我无法理解OOM-killer正在监视容器工作集内存的事实。我认为我没有理解容器上的工作集内存的含义,即“总使用量-非活动文件”。

我应该去哪里找到参考资料?或者你能解释一下工作集内存和容器 OOM-kill 之间的关系吗?

1个回答

7
作为您已经知道的,container_memory_working_set_bytes是:
工作集内存的数量,其中包括最近访问的内存、脏内存和内核内存。因此,工作集是(小于或等于) </= "usage"。 container_memory_working_set_bytes用于OoM决策,因为它排除了可以在内存压力情况下清除的缓存数据(Linux Page Cache)。
因此,如果将container_memory_working_set_bytes增加到极限,它将导致oomkill。
您可以发现当Linux内核检查可用内存时,它调用vm_enough_memory()来找出有多少页可能可用。
当机器内存不足时,包括缓存在内的旧页面框架将被回收,但内核仍然可能发现无法释放足够的页面以满足请求。现在是调用 out_of_memory() 来终止进程的时候了。为确定要终止的候选进程,它使用 oom_score
因此,当工作集字节达到限制时,这意味着即使回收旧页面(包括缓存),内核仍无法找到可用页面,因此内核将触发 OOM-killer 以终止进程。
您可以在 Linux 内核文档中找到更多详细信息:

1
我刚刚添加了内核触发OOM-killer的详细信息,并添加了内核文档链接。 - zeroFruit

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接