首页 > 解决方案 > 如何防止 Linux 内核在 RAM 即将耗尽时驱逐文件支持的可执行页面?(否则会导致磁盘抖动)

问题描述

这样做的目的是防止内核在即将耗尽 RAM 时导致大量磁盘读取(有效地冻结系统),即使没有启用交换,但在 OOM-killer 触发之前!

注意:vm.swappiness(sysctl) 的值对此没有影响!关闭交换(所有交换分区都关闭)也没有效果。

我猜要么答案需要使用某些选项重新编译内核(我在这里.config问过这个问题),但我还没有尝试过(因为我不知道如何为我的操作系统重新编译内核),但很可能它可能需要修补内核(因此为什么这个问题是关于 SO,我把它放在这里是错的吗?)。但也许还有其他方法,我不知道。

有关代码页何时被驱逐的更多详细信息,请参阅:
1. 此答案及其下方的评论:https ://askubuntu.com/a/432827/861003 2. https://unix
的答案和 David Schwartz 评论。 stackexchange.com/a/24646/306023

我在此处粘贴第 1 点的评论:

例如,考虑这样一种情况,您的交换空间为零并且系统几乎耗尽 RAM。内核将从例如 Firefox 中获取内存(它可以这样做,因为 Firefox 正在运行已从磁盘加载的可执行代码 - 如果需要,可以再次从磁盘加载代码)。如果 Firefox 在 N 秒后需要再次访问该 RAM,CPU 会产生“硬故障”,迫使 Linux 释放一些 RAM(例如,从另一个进程中获取一些 RAM),从磁盘加载丢失的数据,然后允许 Firefox 继续通常。这与正常的交换非常相似,kswapd0 就是这样做的。– Mikko Rantalainen 2 月 15 日 13:08

实际上,我正在跟踪这个gist上发生的这些磁盘抖动情况(由于代码页被逐出,然后重新读取,然后再次被逐出等) (也有屏幕截图,例如 iotop)

编辑:相关问题:https:
//unix.stackexchange.com/q/373312/306023 EDIT2:我也在linux-kernel邮件列表(这里:https ://lkml.org/lkml/ 2018/8/22/176)但没有回复。
EDIT3:找到了一种方法,用这个问题的补丁修补内核。

标签: linuxlinux-kernelout-of-memory

解决方案


cgroups-v2 内存控制器中的 memory.min 参数应该会有所帮助。

即,让我引用:

硬内存保护。如果 cgroup 的内存使用量在其有效最小边界内,则在任何情况下都不会回收 cgroup 的内存。如果没有可用的未受保护的可回收内存,则调用 OOM 杀手。

来源:https ://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html

也就是说,使用内存控制器创建一个“sysdefault”cgroup。将 memory.min 参数设置为等于 RAM 的大小。瞧:您的匿名页面可能会被我们交换,但您的基于文件的页面将永远不会被回收。


推荐阅读