【问题标题】:Is it possible for a userland process to handle OOM error in linux?用户态进程是否可以处理 linux 中的 OOM 错误?
【发布时间】:2015-07-12 17:33:45
【问题描述】:

假设我已经禁用了所有与 oom 相关的功能(没有 OOM 杀手)。一个进程已经占用了所有可用内存,它仍在尝试从一个映射的磁盘文件中读取一些字节,该文件不在任何页面缓存中。这个进程是否会得到一个OOM信号,以便它可以反应性地释放一些内存并稍后重试?

【问题讨论】:

    标签: linux memory-management page-caching


    【解决方案1】:

    这取决于许多条件。

    1)如何禁用 oom-killer?

    假设您将 2 写入 /proc/sys/vm/overcommit_memory, 这意味着:

    2:总是检查,从不过度使用(参见 man 5 proc)

    之后你调用了 mmap。

    2)您在“mmap”中使用哪些标志?

    假设您使用 MAP_NORESERVE, 在另一种情况下(没有 MAP_NORESERVE)mmap 只是返回错误, 如果没有足够的物理内存。

    3) 你的 overcommit_ratio 值是多少? 假设它不为零,如果为零则 mmap 返回错误, 我们不能处于“没有文件页面”的情况。

    如果所有这些假设都是正确的,那么你会发现: mm/oom_kill.c::pagefault_out_of_memory,

    又是新的条件:

    4)我们可能在 cgroup 中禁用 oom 吗?

    如果是,那我们就去睡觉。

    最后调用了 oom-killer

    关于禁用 oom

    “我们只是去睡觉”是指系统暂停吗?

    参见 linux-source/Documentation/cgroups/memory.txt:

    如果禁用 OOM-killer,cgroup 下的任务将挂起/休眠 当他们请求负责的内存时,在内存 cgroup 的 OOM-waitqueue 中。

    因此,禁用 oom-killer 的 cgroup 部分进入睡眠状态, 不是所有系统。

    我们,用户态进程是否有可能处理这个页面错误?

    1) 可以这样做: https://lwn.net/Articles/550555/

    2) 或者您可以只观看 oom-killer 事件。

    再次查看 linux-source/Documentation/cgroups/memory.txt:

    memory.oom_control 文件用于 OOM 通知和其他控件。

    内存 cgroup 使用 cgroup 通知实现 OOM 通知器 API(参见 cgroups.txt)。它允许注册多个OOM通知 当 OOM 发生时交付并收到通知。

    要注册通知程序,应用程序必须:...

    【讨论】:

    • 感谢这么长的 if-else 解释。顺便说一句,在模式 2 中,MAP_NORESERVE 标志被忽略。 “我们只是去睡觉”,你的意思是系统暂停吗?
    • 我们,用户态进程是否有可能处理这个页面错误?
    • >在模式 2 中,忽略 MAP_NORESERVE 标志在“man 5 proc”中描述了 MAP_NORESERVE 如何处理,在模式 0 中忽略了 MAP_NORESERVE,但在模式 2 中没有。
    • 这很有趣。根据这个 [kernel.org/doc/Documentation/vm/overcommit-accounting],模式 2 将忽略 MAP_NORESERVE 标志。
    【解决方案2】:

    如果您禁用了oom-killer,那么进程将不会收到信号,但一旦内存耗尽,malloc() 调用就会失败。

    【讨论】:

    • 谢谢。主要是我很好奇如果从未缓存的 mmapped 磁盘文件中读取页面会发生什么?
    • 有趣的问题,我承认我不知道答案。愚蠢的问题:你试过了吗?
    猜你喜欢
    • 2017-07-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-24
    • 2015-05-09
    • 1970-01-01
    • 2014-12-11
    • 1970-01-01
    相关资源
    最近更新 更多