我遇到了一些间歇性问题,这些问题似乎与 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 杀手,请尝试较低的比率值。