linux - `container_memory_working_set_bytes` 指标和容器上的 OOM-killer 之间有什么关系?
问题描述
我试图找出并了解 OOM-killer 如何在容器上工作。
为了弄清楚这一点,我阅读了很多文章,我发现 OOM-killer 会杀死基于oom_score
. 并且oom_score
由oom_score_adj
该进程的内存使用情况决定。
并且有两个指标container_memory_working_set_bytes
,container_memory_rss
来自 cAdvisor,用于监控容器的内存使用情况。
似乎container_memory_rss
RSSoom_score
内存container_memory_rss
(
- https://github.com/torvalds/linux/blob/v3.10/fs/proc/base.c#L439
- https://github.com/torvalds/linux/blob/v3.10/mm/oom_kill.c#L141
- https://github.com/torvalds/linux/blob/v3.10/include/linux/mm.h#L1136
但是从下面的文章中:
- https://faun.pub/how-much-is-too-much-the-linux-oomkiller-and-used-memory-d32186f29c9d
- https://blog.freshtracks.io/a-deep-dive-into-kubernetes-metrics-part-3-container-resource-metrics-361c5ee46e66
更好的指标是
container_memory_working_set_bytes
因为这是 OOM 杀手所关注的。
我无法理解 OOM-killer 正在监视容器的工作集内存这一事实。我想我不明白容器上工作集内存的含义,即“总使用量 - 非活动文件”。
我在哪里可以找到参考资料?或者你能解释一下工作集内存和容器上的OOM-kill之间的关系吗?
解决方案
如您所知,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-killer 来终止进程。
您可以在 Linux 内核文档中找到更多详细信息:
推荐阅读
- vagrant - Zeek Vagrant 设置
- django - 在 is_valid 之后拒绝表单帖子
- javascript - 来自工厂的对象根据访问位置返回不同的属性值
- c# - 空心正方形里面的空心正方形 C#
- python - 从 JSON 文件中删除“”,这样它们就不会中断字符串
- python - Yaml,是否有任何方法可以在调用锚点后添加一些字符
- javascript - 遍历嵌套数组以返回对象的值
- jquery - django 视图无法访问 webkitformboundary
- python - 这个程序一遍又一遍地循环同样的事情,我希望它做一次,然后继续循环下面的其他程序
- javascript - 链接图像未从 Json 加载到哈巴狗