Linux OOM 磁盘 I/O。另外:交换,它有什么用?

ext*_*ros 7 linux swap virtual-memory

我在我的 Linux (2.6.37) 安装之一上遇到了 OOM 杀手的问题。计算机有 4GB 的内存,我有时会充分利用它。在这些情况下,我希望 OOM 处理程序通过杀死一两个进程来完成它的工作。而不是这样做,或者可能在尝试这样做时,系统会锁定,像没有明天一样进行磁盘 I/O。事情是这样的:我没有启用任何交换。出于某种原因,我的无交换系统仍然被大量磁盘 I/O 锁定,即使适当的行动方案是杀死一两个进程。想法?

整个问题让我怀疑 Linux 是否需要以某种我不知道的方式交换。对是否是这种情况以及原因的解释将不胜感激。我在概念级别(即虚拟内存、分页、过量使用)上熟悉交换的想法,但我想知道是否有任何我可能遗漏的实现细节。

Chr*_*ell 6

真正的问题是,你为什么在没有交换的情况下运行?特别是如果您看到与 RAM 不足相关的(严重)性能问题?您知道没有交换实际上会使您的系统变慢,对吗?

显而易见的解决方案是添加一些交换空间,而不是让您的系统陷入困境。考虑到磁盘空间是多么便宜,我想不出任何常见的情况1您应该没有交换的情况下构建系统。

至于回答你的问题,我不记得为什么交换很重要的所有低级细节,即使在你不会耗尽内存的系统上,但 Linux 内核邮件列表上有关于是否在没有交换的情况下运行系统是合理的(并且没有很多确凿的答案)。一般的共识通常是总是有 swap,并根据需要调整 swapiness。

另外,我认为您误解了有关 Linux OOM 杀手的一些重要警告。首先,依靠它来处理内存不足问题是一个非常糟糕的主意 (tm)。它可能会非常不加选择地杀死什么,并且完全有可能留下一个不稳定甚至无法使用的系统。是的,它试图杀死正在消耗大量内存的最近进程(尝试捕获失控进程的次要保护措施),但不能保证。我见过它杀死 ssh,杀死 Xen 进程(在 Xen 虚拟主机服务器上,导致 VM 崩溃),并且在一种情况下它杀死了 NFS。

至于IO。. . 我不确定是什么原因造成的。也许文件系统或磁盘相关进程被杀死了?也许一个进程在无法分配足够的内存时内置了某种“缓存到磁盘”功能?

另请注意,如果这是台式机,则暂停到磁盘需要交换。如果是服务器,依赖 OOM绝不是一个好主意,因为它会损害稳定性,好吧,根本没有充分的理由。

[1] 嵌入式系统是唯一明显的例外,它们并不是特别常见(如果您正在处理嵌入式系统,您就会意识到这些要求)。


小智 5

我认为 AndreasM 已经把它击中了(这是磁盘全部崩溃的原因。)可执行文件是按需分页的——因此在正常操作中,您几乎所有的可执行文件和库都位于良好的物理 RAM 中。但是,当 RAM 运行不足时,但不足以运行内存不足杀手时,这些页面将从 RAM 中逐出。因此,您最终会遇到页面被逐出的情况——起初,没问题,因为它们首先被逐出最近最少使用的页面,并且它会踢出您无论如何都不使用的页面。但是,它会踢出您正在使用的那些,只是稍后必须立即将它们分页。鞭挞城。

基本上,如果某些东西使用了更多的 RAM,您可能会启动 OOM 杀手,但您还没有到那里。正如一些人所说,OOM 杀手是不分青红皂白的,它实际上是避免内核恐慌的最后手段,而不是您应该考虑在正常操作中使用的东西。如果您有一些自定义设置,我会考虑编写一些守护程序来监视空闲内存,并在接近满时使用您选择的策略进行终止。