我在安装的 Linux (2.6.37) 之一中使用 OOM 终止程序时遇到了问题。计算机有 4GB 内存,我有时会充分利用这些内存。在这种情况下,我希望 OOM 处理程序能够介入并通过终止一两个进程来完成其工作。但系统并没有这样做,或者也许在尝试这样做时,系统锁定了,像没有明天一样进行磁盘 I/O。事情是这样的:我没有启用任何交换。由于某种原因,我的无交换系统仍然因大量磁盘 I/O 而锁定,尽管适当的操作只是终止一两个进程。您怎么看?
整个问题让我怀疑 Linux 是否以某种我不知道的方式需要交换。如果能解释一下是否如此以及原因,我将不胜感激。我熟悉概念层面上的交换概念(即虚拟内存、分页、过度使用),但我想知道是否有任何我可能遗漏的实现细节。
答案1
真正的问题是,为什么你运行的时候没有使用交换?特别是当你看到与内存耗尽相关的(严重)性能问题时?你知道没有交换实际上会使你的系统变慢,对吧?
显而易见的解决方案是添加一些交换空间,这样系统就不会出现问题。考虑到磁盘空间很便宜,我想不出在哪些常见情况下你应该曾经建立一个没有交换的系统。
至于回答你的问题,我不记得为什么交换在不会耗尽内存的系统上很重要的所有底层细节,但 Linux 内核邮件列表中一直存在关于在没有交换的情况下运行系统是否合理的争论(并且没有很多确定的答案)。一般共识通常是总是有交换,并根据需要调整交换性。
另外,我认为您误解了有关 Linux OOM 杀手的一些重要注意事项。首先,依靠它来处理您的内存不足问题是一个非常糟糕的想法 (tm)。它可能会非常不加区分地杀死它所杀死的东西,并且完全有可能让您留下一个不稳定甚至无法使用的系统。是的,它会尝试杀死正在消耗大量内存的最近进程(一种试图捕获失控进程的次要保护措施),但没有保证。我见过它杀死 ssh、杀死 Xen 进程(在 Xen 虚拟主机服务器上,导致虚拟机崩溃),并且在一个案例中它杀死了 NFS。
至于 IO...我不确定是什么原因造成的。也许是文件系统或磁盘相关进程被终止了?也许是某个进程在无法分配足够内存时内置了某种“缓存到磁盘”功能?
另外需要注意的是,如果这是一台台式机,则需要交换才能挂起到磁盘。如果是服务器,则依赖 OOM 是绝不这是一个好主意,因为它毫无理由地损害了稳定性。
[1] 嵌入式系统是唯一明显的例外,而且它们并不是特别常见(如果您正在处理嵌入式系统,那么您已经知道这些要求了)。
答案2
我认为 AndreasM 已经说对了(磁盘变得非常混乱的原因)。可执行文件是按需分页的——因此在正常操作中,几乎所有的可执行文件和库都位于物理 RAM 中。但是当 RAM 不足,但不足以运行内存不足杀手时,这些页面就会从 RAM 中被驱逐。因此,最终会出现页面被驱逐的情况——一开始没有问题,因为它们首先被驱逐的是最近最少使用的页面,并且它会驱逐你没有使用的页面。但是,它会驱逐你是使用,只是片刻之后就必须将它们重新翻页。 垃圾城。
基本上,如果某个程序使用了更多 RAM,则 OOM 终止程序可能会启动,但您还没有这样做。正如一些人所说,OOM 终止程序是无差别的,它实际上更像是避免内核崩溃的最后手段,而不是您应该在正常操作中考虑使用的东西。如果您有一些自定义设置,我会考虑编写一些守护进程来监视可用内存,并在内存接近满时使用您选择的策略终止内存。