我尝试调整我的开发系统以实现最大可靠性。我禁用了交换,因为对于 GUI 使用来说,它主要导致机器无响应,以至于无法再使用。然而,如果激进的应用程序耗尽了内存,某些机制似乎会启动,以牺牲速度为代价最大限度地利用内存。没有硬盘交换操作,但系统同样变得无响应。所以我想在系统对内存增益做出任何特殊努力之前让 OOM 杀手启动。是否可以配置 OOM 杀手,使其在可用物理内存少于 100 MB 时采取行动?
答案1
我也曾为这个问题苦恼过。不管怎样,我只希望我的系统能够保持响应,我宁愿丢失进程也不愿等待几分钟。使用内核 oom killer 似乎无法实现这一点。
然而,在用户空间中,我们可以为所欲为。所以我写了 Early OOM Daemon (https://github.com/rfjakob/earlyoom) 一旦可用 RAM 低于 10%,它就会终止最大的进程(通过 RSS)。
如果没有 earlyoom,启动时很容易锁定我的机器(8GB RAM)http://www.unrealengine.com/html5/几次。现在,有问题的浏览器标签在事情失控之前被关闭了。
答案2
内核的默认策略是,只要有空闲的物理内存,就允许应用程序继续分配虚拟内存。在应用程序使用它们分配的虚拟内存之前,物理内存实际上不会被使用,因此应用程序可以分配比系统内存多得多的内存,然后开始使用它们,导致内核内存不足,并触发内存不足 (OOM) 终止程序。不过,在终止占用内存的进程之前,它已经导致磁盘缓存被清空,这会使系统在缓存重新填充之前一段时间内响应缓慢。
您可以通过将值 2 写入 来更改默认策略以禁止内存过量使用/proc/sys/vm/overcommit_memory
。 的默认值为/proc/sys/vm/overcommit_ratio
50,因此内核不允许应用程序分配超过 50% 的 RAM+交换空间。如果您没有交换空间,则内核将不允许应用程序分配超过 50% 的 RAM,而将其余 50% 留给缓存。这可能有点过分,因此您可能需要将此值增加到 85% 左右,这样应用程序就可以分配最多 85% 的 RAM,将 15% 留给缓存。
答案3
对我来说,设置 vm.admin_reserve_kbytes=262144 就是为了达到这个目的。OOM killer 会在系统完全无响应之前介入。
答案4
内存不足和 OOM 杀手无法达到可靠性。
在壁橱里组织聚会是错误的“清理我的衣橱”在你的小播放列表中。
是否可以让 OOM 杀手更早地介入?
这样做会产生意想不到的副作用,因为你无法控制被杀死的东西。
我尝试调整我的开发系统以实现最大可靠性。
最大可靠性包括测试您的系统并根据这些测试改进您的系统。
只是调整随机事物不会让你到达任何地方……
我禁用了交换,因为对于 GUI 使用来说,它主要导致机器无响应,无法再使用。然而,如果攻击性应用程序耗尽了内存,某些机制似乎会启动,以牺牲速度为代价最大限度地利用内存。
由于内存不足,禁用交换不会改善行为,它的作用恰恰相反。
为了在这种情况下提高可靠性,请添加更多内存,以使您的系统响应更快,并且不会在用户不知情的情况下随机终止进程。您不应该依赖低内存条件和这样的机制,尤其是在开发环境中……
没有进行硬盘交换操作,但是系统同样变得无响应。
无论是否有交换,内存不足的情况确实会导致无响应。
因此,我想在系统对内存增益做出任何特殊努力之前让 OOM 杀手启动。
正如我上面所解释的,这些特殊的努力弊大于利。相反,你可以自己杀死不需要的进程,但我想你不能这样做,所以 OOM 会杀死你需要的进程。
是否可以配置 OOM killer 在可用物理内存少于 100 MB 时采取行动?
可能是,但如果你只是购买一些额外的内存,你会获得更高的投资回报,而这些内存现在并不贵。想想看,如果你继续在低内存条件下工作,从长远来看,你会自食其果。OOM 就像一个法警,它不会协助你,而是协助操作系统......