4

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

4

2 回答 2

0

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

于 2015-05-03T08:41:26.070 回答
0

这取决于许多条件。

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 通知 API 实现 OOM 通知程序(参见 cgroups.txt)。它允许注册多个OOM通知传递并在OOM发生时获得通知。

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

于 2015-05-03T09:59:37.680 回答