用户进程是否可以在linux中处理OOM错误?

时间:2015-05-03 07:35:15

标签: linux memory-management page-caching

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

2 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分: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返回错误, 而且我们无法处理文件"。

的页面

如果所有这些假设都是真的,那么你来: 毫米/ oom_kill.c :: pagefault_out_of_memory,

再次出现新情况:

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

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

最后,oom-killer被称为

关于停用

  

通过"我们只是去睡觉",你的意思是系统暂停吗?

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

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

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

  

我们userland进程是否可能处理此页面错误?

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

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