假设我已经禁用了所有与oom相关的功能(没有OOM杀手)。进程占用了所有可用内存,并且仍在尝试从mmapped磁盘文件中读取一些字节,该文件不在任何页面缓存中。此过程是否会获得OOM信号,以便它可以反应性地释放一些内存并在以后重试?
答案 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发生时收到通知。
要注册通知程序,应用程序必须:...