如何在 Linux 中的低内存条件下触发操作?

Par*_*hot 10 linux kernel out-of-memory

所以,我认为这将是一个非常简单的定位:一个服务/内核模块,当内核注意到用户空间内存不足时,会触发一些操作(例如,将进程列表转储到文件中,ping 某个网络端点,等等) 在具有自己专用内存的进程中(因此它不会失败 fork() 或遭受任何其他常见的 OOM 问题)。

我发现了OOM 杀手,我认为它很有用,但它并没有真正做我需要做的事情。

理想情况下,如果我的内存不足,我想知道原因。我想我可以编写自己的程序,在启动时运行并使用固定数量的内存,然后仅在内核通知内存不足时才执行操作,但这带来了它自己的问题......

甚至有一个系统调用被告知类似的事情吗?一种对内核说“嘿,当我们只剩下 128 MB 内存时叫醒我”的方法?

我在网上和这里搜索,但没有找到任何符合该描述的内容。似乎大多数人在时间延迟上使用轮询,但明显的问题是它使您不太可能知道是哪个进程导致了问题。

小智 16

是的,Linux 内核确实为此提供了一种机制:内存压力通知。这记录在https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt 的Memory Pressure部分。

简而言之,您注册一个 eventfd 文件描述符/sys/fs/cgroup/memory/memory.pressure_level,您希望在其中接收通知。这些通知可能是lowmediumcritical。一个典型的用例是在收到通知时释放进程中的部分或全部内部缓存,以防止即将发生的 OOM 终止。


小智 8

您要问的是,基本上,在低内存条件下基于内核的回调,对吗?如果是这样,我坚信内核没有提供这种机制,并且有一个很好的理由:内存不足,它应该立即运行唯一可以释放一些内存的东西——OOM 杀手。任何其他程序都可以使机器停止。

无论如何,您可以在用户空间中运行一个简单的监控解决方案。过去我有相同的低内存调试/操作要求,我编写了一个简单的 bash,它执行以下操作:

  • 监控软水印:如果内存使用率高于此阈值,则收集一些统计信息(进程、空闲/已用内存等)并发送警告电子邮件;

  • 监控硬水印:如果内存使用率高于此阈值,则收集一些统计信息并杀死更多内存消耗(或不太重要)的进程,然后发送警报电子邮件。

这样的脚本非常轻量级,它可以以很小的间隔(即:15 秒)轮询机器