我有一台没有交换空间的 Linux 机器,它设置了vm.overcommit_memory=2
和vm.overcommit_ratio=100
。但是这些设置似乎没有效果。一些试图消耗大量内存的新启动的进程仍然被 OOM 终止,而不是被拒绝分配内存。是不是因为之前启动的进程sysctl -w vm.overcommit_memory=2 vm.overcommit_ratio=100
(例如/etc/sysctl.conf
在启动期间应用了 before)可能仍然能够访问其过度使用的内存,从而触发 OOM 终止程序?是否可以(1)使用内核参数禁用内存过量提交,或者(2)在运行时强制内核为所有进程分配所有过量提交的内存?
编辑:浏览相关Documentation/
和部分 Linux 源代码(git c6fa8e6de3)后(1)似乎不太可能。
答案1
您正在尝试做一件根本不可能的事情。如果您让系统运行到接近耗尽,那么总会有进程因内存耗尽而被终止的可能性。有很多情况是无法避免的,但最容易理解的是由于进程将页面添加到其堆栈而导致的页面错误。
如果您想避免 oom killing,则需要交换或 RAM 缓冲。