linux - 如何防止 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:找到了一种方法,用这个问题的补丁修补内核。
解决方案
cgroups-v2 内存控制器中的 memory.min 参数应该会有所帮助。
即,让我引用:
硬内存保护。如果 cgroup 的内存使用量在其有效最小边界内,则在任何情况下都不会回收 cgroup 的内存。如果没有可用的未受保护的可回收内存,则调用 OOM 杀手。
来源:https ://www.kernel.org/doc/html/latest/admin-guide/cgroup-v2.html
也就是说,使用内存控制器创建一个“sysdefault”cgroup。将 memory.min 参数设置为等于 RAM 的大小。瞧:您的匿名页面可能会被我们交换,但您的基于文件的页面将永远不会被回收。
推荐阅读
- javascript - 将用户位置保存到 mongodb、nodejs 服务器
- java - 检索 TextView 的名称并在其他类之间共享它们的值
- android - How to switch jetpack camerax preview from back to front vice versa?
- python-3.5 - Half day leaves in payslip
- html - 将复选框居中在一行中
- wordpress - 如何在 Wordpress 中合并 2 个列表菜单
- python-3.x - 如何使用sqlite在python中用户定义的列的变量编号中输入可变数量的值?
- rest - 使用 JWT 保护用于验证客户端的 RESTful API
- webpack - 如何在项目中加载全局模块?
- prometheus - 路由匹配多个标签