如何禁用Linux中的OOM杀手?

我目前的configuration是:

> cat /proc/sys/vm/panic_on_oom 0 > cat /proc/sys/vm/oom_kill_allocating_task 0 > cat /proc/sys/vm/overcommit_memory 1 

但是当我执行任务时,无论如何都会被杀死。

 > ./test/mem.sh Killed > dmesg | tail -2 [24281.788131] Memory cgroup out of memory: Kill process 10565 (bash) score 1001 or sacrifice child [24281.788133] Killed process 10565 (bash) total-vm:12601088kB, anon-rss:5242544kB, file-rss:64kB 

更新

我的任务习惯于科学计算,这会花费很多回忆,看来overcommit_memory=1可能是最好的select。

更新2

实际上,我正在做一个数据分析项目,这个项目花费的内存超过16G ,但我被要求限制在5G左右。 通过优化程序本身来实现这个要求可能是不可能的,因为项目使用了许多子命令,而且大多数子程序都不包含诸如Java中的XmsXmx类的选项。

更新3

我的项目应该是一个过度的系统。 就像a3f所说的那样,当mem分配失败时,我的应用程序似乎更喜欢xmalloc崩溃。

 > cat /proc/sys/vm/overcommit_memory 2 > ./test/mem.sh ./test/mem.sh: xmalloc: .././subst.c:3542: cannot allocate 1073741825 bytes (4295237632 bytes allocated) 

我不想屈服,虽然这么多的考验让我筋疲力尽。 所以,请给我一个通往光明的途径。 )

Solutions Collecting From Web of "如何禁用Linux中的OOM杀手?"

OOM杀手不会消失。 如果没有记忆,有人需要付钱。 你可以做的是设置一个限制之后内存分配失败。 这正是将vm.overcommit_memory2达到的目的。

从文档 :

Linux内核支持以下过度使用处理模式

2 – 不要过度使用。 系统的总地址空间提交不允许超过swap +物理RAM的可配置数量(默认为50%)。 根据您使用的数量,在大多数情况下,这意味着进程在访问页面时不会被终止,但会根据情况收到内存分配错误。

通常,内核会高兴地发出虚拟内存(overcommit)。 只有当你引用一个页面时,内核必须把页面映射到一个真实的物理框架。 如果它不能服务这个请求,那么一个进程需要被OOM杀手杀死以腾出空间。

禁用overcommit意味着如果内核无法提交请求的内存量, malloc(3)将返回NULL 。 这使得事情有点可预测,虽然有限(许多应用程序分配比他们所需要的更多)。

oom_adj的可能值范围从-17到+15。 得分越高,相关过程就越有可能被杀手杀死。 如果oom_adj被设置为-17,则不会考虑该进程用于OOM查杀。

但是,增加内存是更好的选择,如果增加内存是不可能的,那么添加交换内存。

增加交换内存尝试这个链接 ,