【问题标题】:What is the relation between `container_memory_working_set_bytes` metric and OOM-killer on the container?`container_memory_working_set_bytes` 指标和容器上的 OOM-killer 之间有什么关系?
【发布时间】:2021-03-30 14:33:36
【问题描述】:

我正在尝试找出并了解 OOM-killer 在容器上的工作原理。

为了弄清楚这一点,我阅读了很多文章,我发现 OOM-killer 会根据 oom_score 杀死容器。而oom_scoreoom_score_adj 和该进程的内存使用情况决定。

还有来自 cAdvisor 的两个指标 container_memory_working_set_bytescontainer_memory_rss 用于监控容器的内存使用情况。

似乎 RSS 内存 (container_memory_rss) 对 oom_score 有影响,所以我可以理解,使用 container_memory_rss 指标,如果该指标达到内存限制,OOM-killer 将终止进程。

但是从下面的文章来看:

更好的指标是container_memory_working_set_bytes,因为这是 OOM 杀手所关注的。

我无法理解 OOM-killer 正在监视容器的工作集内存这一事实。我想我不明白容器上的工作集内存的含义,即“总使用量 -非活动文件”。

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

【问题讨论】:

    标签: linux kubernetes memory containers


    【解决方案1】:

    如您所知,container_memory_working_set_bytes 是:

    工作集内存的数量,它包括最近访问的 内存、脏内存和内核内存。因此,工作集是 (小于或等于)=“用法”。

    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 内核文档中找到更多详细信息:

    【讨论】:

    • 我只是附加了内核如何触发OOM-killer的细节并添加了内核文档链接。
    猜你喜欢
    • 2021-04-02
    • 2013-01-19
    • 2014-12-11
    • 2021-09-18
    • 2016-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-08-28
    相关资源
    最近更新 更多