如何禁用linux中的oom杀手?

时间:2016-03-04 08:37:34

标签: linux docker cgroups

我目前的配置是:

> 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可能是最好的选择。

更新2

实际上,我正在开展数据分析项目,该项目的内存成本超过16G,但我被要求将其限制在大约5G。通过优化程序本身可能无法实现此要求,因为项目使用了许多子命令,并且大多数子命令不包含Java中的XmsXmx等选项。

更新3

My project应该是一个过度的系统。正如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)

我不想投降,虽然这么多令人厌烦的测试让我筋疲力尽。 那么请告诉我一个通向光明的道路; )

2 个答案:

答案 0 :(得分:9)

OOM杀手不会消失。如果没有记忆,有人必须付钱。您可以做的是设置一个限制,在该限制之后内存分配失败。 这正是将vm.overcommit_memory设置为2所实现的目标。

来自the docs

  

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

     

2 - 不要过度使用。系统的总地址空间提交   不允许超过交换+可配置的金额(默认为   50%的物理RAM。取决于您使用的金额,大多数情况下   这意味着访问过程中不会终止进程         页面,但会在适当的时候收到内存分配错误。

通常,内核会很乐意分发虚拟内存(overcommit)。只有在引用页面时,内核才必须将页面映射到真实的物理帧。如果它无法为该请求提供服务,则需要OOM杀手杀死进程以腾出空间。

禁用过度使用意味着例如如果内核无法提交请求的内存量,malloc(3)将返回NULL。这使事情变得更加可预测,尽管有限(许多应用程序分配的内容超出了他们的需求)。

答案 1 :(得分:1)

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

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

要增加互换内存,请尝试this link