完全禁用 oom Killer

完全禁用 oom Killer

我遇到了一些间歇性问题,这些问题似乎与 oomkiller 清除一些子进程有关,但我不明白为什么。

有没有一种方便的方法可以通过 sysctl 抑制所有 oomkiller 活动?

我发现一些说明说这些应该有效,但它们对我来说不存在。

sysctl -w memory.oom_control=1
sysctl -w vm.oom-kill=0

我也看到有人建议这两个,但 oom 杀手仍在继续。

sysctl vm.overcommit_memory=2
sysctl vm.overcommit_kbytes=0

答案1

你可以使用/proc/sys/vm/overcommit_memory(参见过程(5)),例如

echo 2 > /proc/sys/vm/overcommit_memory

以 root 身份禁用它。另请参阅内核的文档/vm/overcommit-accounting

(如果您运行的是旧内核,请考虑升级它)

答案2

虽然这个问题比较老了,但是今天看书的时候突然想到了......

sysctl -w内存.oom_control=1

你几乎永远不想这样做。大多数 Linux 发行版开箱即用,默认设置为“0”,这意味着内核会猜测过量使用内存的量。 “1”意味着它总是会过度使用。如果您在(接近)稳态机器上遇到 OOM 错误,则应该使用以下值2。这不会禁用过度使用!它只是对内核承诺给程序的内存量设置限制。该限制由overcommit_ratio或确定overcommit_kbytes。不幸的是这个文件没有表明如何解决其中每个值中的冲突值。但如果你看看...

设置其中一个会禁用另一个(读取时显示为 0)。

过量使用率的正确值取决于机器的使用方式。默认值(RAM + SWAP * 1.5 = 50)对于台式机可能有意义,但对于服务器来说 IME 相当高。将服务器置于交换位置通常是一件坏事。

因此,简短的版本是:

sysctl vm.overcommit_memory=2
sysctl vm.overcommit_ratio=20

...如果您仍然看到 OOM 杀手,请尝试较低的比率值。

相关内容