在linux中,userland进程是否可以处理OOM错误?

在linux中,userland进程是否可以处理OOM错误?,linux,memory-management,page-caching,Linux,Memory Management,Page Caching,假设我已经禁用了所有与oom相关的功能(没有oom杀手)。某个进程已占用所有可用内存,并且仍在尝试从未在任何页面缓存中的映射磁盘文件中读取一些字节。此进程是否会收到OOM信号,以便它可以反应性地释放一些内存,稍后重试?如果您禁用了OOM killer,则进程将不会收到信号,但malloc()调用将在内存耗尽后失败。这取决于许多条件 1) 你是怎么让杀手瘫痪的 假设您将2写入/proc/sys/vm/overmit_内存, 这意味着: 2:始终检查,绝不过度使用(参见man 5程序) 之后你打电话

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

如果您禁用了
OOM killer
,则进程将不会收到信号,但
malloc()
调用将在内存耗尽后失败。

这取决于许多条件

1) 你是怎么让杀手瘫痪的

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

2:始终检查,绝不过度使用(参见man 5程序)

之后你打电话给mmap

2) 你在“mmap”中使用什么标志

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

3) 你的超负荷率是多少? 假设它不是零,如果它是零,那么mmap返回错误, 我们不可能处于“没有文件页”的情况

如果所有这些假设都是真的,那么你会得出: mm/oom\u kill.c::pagefault\u内存不足

还有一个新情况:

4) 我们可能是在有oom禁用的cgroup中吗

如果是的话,我们就去睡觉

最后一个杀手被叫来了

关于禁用oom

“我们只是去睡觉”,你的意思是系统暂停吗

请参阅linux source/Documentation/cgroups/memory.txt:

如果禁用OOM killer,cgroup下的任务将挂起/休眠 内存中cgroup请求可解释内存时的OOM等待队列

因此,处理部分cgroup,使其处于睡眠状态, 不是所有的系统


我们,userland进程是否有可能处理这个页面错误

1) 可以这样做:

2) 或者你可以只看杀人事件

请再次参阅linux source/Documentation/cgroups/memory.txt:

memory.oom_控制文件用于oom通知和其他控制

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


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

谢谢。我主要好奇的是,如果从未缓存的MMAP磁盘文件中读取页面,会发生什么?有趣的问题,我承认我不知道答案。愚蠢的问题:你试过了吗?谢谢你这么长时间的解释。顺便说一句,在模式2中,MAP_NORESERVE标志被忽略。“我们只是进入睡眠状态”,你的意思是系统暂停吗?我们,userland进程是否有可能处理此pagefault?>在模式2中,MAP_NORESERVE标志被忽略在“man 5 proc”中描述了MAP_NORESERVE如何处理,MAP_NORESERVE在模式0中被忽略,但在模式2中没有。这很有趣。根据该[,模式2将忽略MAP_NORESERVE标志。