Debian 9.4,Linux 4.9
我有时会编译一些几乎无法放入 RAM 的内容,或者一个流氓进程突然开始占用超过可用内存的内存。当进程超出可用 RAM 时,Linux 开始破坏磁盘,即使我启用了零交换(不启用交换是为了避免这种情况)。我猜它会开始丢弃并重新加载mmap
当前正在运行的二进制文件的 ped 部分之类的东西?
此时我的 X 会话很快就变得没有响应,我所能做的就是等待几十分钟,直到整个 X 会话被终止,我才能重新登录。
我尝试寻找解决方案,但似乎没有任何效果。OOM 杀手无法捕获此过程,vm.overcommit_memory=2
我甚至无法使用 GDM 和 Gnome 登录。
有没有办法告诉 Linux 根本不要交换? 这样,我至少有机会通过失败来杀死 rouge 进程malloc
,即使没有,至少我也不需要盯着一台没有响应的机器等待。
或者还有其他提示如何处理这种情况?
答案1
如果您编译的源代码需要几乎所有的可用 RAM,甚至更多,那么唯一有效的解决方案可能就是添加实际 RAM。话虽如此,您可以尝试添加大量的交换空间(比如 2 倍或 3 倍的 RAM)并设置/proc/sys/vm/swappiness
为较低的值,例如 1(请注意,对于内核 3.5+,将其设置为 0 会完全禁用交换空间),这样只有在真正需要时才会使用交换空间。这应该可以最大限度地减少抖动。
答案2
我不明白为什么人们会建议增加更多 RAM 或更多交换空间。行为不端的应用程序可能会消耗掉所有内存并重现问题。
这种冻结是 Linux 内核中一个严重的架构错误。发生冻结后恢复的唯一方法是使用魔法键 (alt+sysrq+f) 强制 OOM。内核日志稍后会告诉您被终止的内容以及原因。
有多个项目正在尝试从用户空间阻止此冻结。例如,请参阅 earlyOOM。