【问题标题】:How to disable the oom killer in linux? [closed]如何在 linux 中禁用 oom 杀手? [关闭]
【发布时间】:2017-09-25 19:57:46
【问题描述】:

我目前的配置是:

> 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 所说的那样,当内存分配失败时,我的应用似乎更喜欢在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)

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

【问题讨论】:

    标签: linux docker cgroups


    【解决方案1】:

    OOM 杀手不会消失。如果没有记忆,就得有人付钱。您可以做的是设置一个限制,之后内存分配会失败。 这正是将vm.overcommit_memory 设置为2 所达到的效果。

    来自the docs

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

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

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

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

    【讨论】:

    • 谢谢!我的任务总是花费很多回忆。如果设置overcommit_memory=2,任务会暂停吗?也许它不适合科学计算任务。
    • @Yang 我更新了答案。如果你想避免 OOM 的情况,你需要购买更多的 RAM(或者修复你的内存管理策略或者继续使用 overcommit 并希望最好)。
    • @Yang 查看我发布的链接。您可以设置分配失败的上限。然后,您的应用程序将不得不处理内存分配失败。许多应用程序只是崩溃(通过空指针取消引用隐式或通过例如xmalloc 显式崩溃)。我不知道你的应用程序是如何处理它的。
    • @Yang 要么重写应用程序以减少消耗,要么增加物理内存。第二种选择可能更便宜。
    • @workless 这取决于过量使用策略,请查看链接文档以获取更多信息。即使使用默认的过度使用行为,malloc(-1) 也会给你NULL
    【解决方案2】:

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

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

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

    【讨论】:

    • do not post an answer that consists essentially of a link。在你的答案中包括要点;留下链接以获取更多信息或作为参考。
    • @glennsl 谢谢。
    • @glennsl,感谢您提供的信息和链接。我更新了我的帖子。
    • @RavipatiPraveen,谢谢!通过将任务的oom_adj 设置为-17,禁用OOM-killing 确实是我想要的。增加交换听起来很酷,它可能会解决问题。稍后我会试一试,谢谢!
    猜你喜欢
    • 2023-04-02
    • 2012-08-26
    • 1970-01-01
    • 2012-12-07
    • 2019-12-25
    • 2019-01-30
    • 2022-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多