8

我目前的配置是:

> 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 中的Xmsor那样的选项。Xmx

更新 3

我的项目应该是一个过度使用的系统。正如a3f所说,似乎我的应用程序更喜欢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)

我不想投降,虽然这么多可怕的考验让我筋疲力尽。所以请告诉我一条通往光明的路;)

4

2 回答 2

11

OOM杀手不会消失。如果没有记忆,就得有人付钱。您可以做的是设置一个限制,之后内存分配会失败。这正是vm.overcommit_memory2实现的设置。

文档

Linux内核支持以下overcommit处理模式

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

通常,内核会愉快地分配虚拟内存(过度使用)。只有当您引用一个页面时,内核才必须将该页面映射到一个真实的物理框架。如果它不能为该请求提供服务,则需要由 OOM 杀手杀死一个进程以腾出空间。

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

于 2016-03-04T08:49:46.580 回答
2

oom_adj 的可能值范围从 -17 到 +15。分数越高,关联进程就越有可能被 OOM-killer 杀死。如果 oom_adj 设置为 -17,则不考虑该进程进行 OOM 终止。

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

要增加交换内存,请尝试此链接

于 2017-09-25T11:05:01.840 回答