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

最佳答案

这取决于许多条件。

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 吗?

如果是,那么我们就去 sleep 。

最后 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 发生时收到通知。

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

10-08 08:20
查看更多