我在Linux(2.6.37)安装中遇到了OOM杀手的问题。 电脑有4GB的内存,我有时充分利用。 在这种情况下,我希望OOM处理程序能够通过杀死一个或两个进程来完成工作。 而不是这样做,或者试图这样做,系统locking,做磁盘I / O,就像没有明天一样。 这是事情:我没有任何交换启用。 出于某种原因,我的swapless系统仍然locking了大量的磁盘I / O,即使适当的行动是杀死一个或两个进程。 思考?
整个问题让我怀疑Linux是否需要以某种我不知道的方式进行交换。 解释是否是这种情况,为什么会不胜感激。 我在概念层面(即虚拟内存,分页,过度使用)熟悉交换的想法,但是我想知道是否有任何实现细节可能已经错过了。
真正的问题是,你为什么没有交换运行? 特别是如果你看到(严重)性能问题与RAM耗尽有关? 你知道没有交换可以让你的系统变慢,对吗?
显而易见的解决scheme是添加一些交换空间,而不是让你的系统废话。 考虑到磁盘空间有多便宜,我想不出有什么共同的情况1你应该build立一个没有交换的系统。
至于回答你的问题,我不记得所有关于为什么交换很重要的底层细节,即使在你不会耗尽内存的系统上,但是在Linux Kernel邮件列表中有关于是否没有交换的情况下运行系统是合理的(并没有很多确凿的答案)。 普遍的共识通常是总是有交换 ,并根据需要调整交换 。
另外,我认为你误会了一些关于Linux OOM杀手的重要警告。 首先,依靠它来处理你的内存不足问题是一个非常糟糕的想法(tm)。 它可能会非常不分青红皂白地死掉,而且完全有可能会留下一个不稳定甚至无法使用的系统。 是的,它试图杀死最近正在吃掉大量记忆的过程(这是试图赶跑逃跑过程的一个小小保障),但是没有保证。 我看到它杀死SSH,杀死Xen进程(在Xen虚拟主机服务器上,导致虚拟机崩溃),并在一个情况下,它杀死NFS。
至于IO。 。 。 我不知道是什么原因造成的。 也许文件系统或磁盘相关的进程死亡? 也许一个进程有一些内置的“caching到磁盘”function,当它不能分配足够的内存?
另外请注意,如果这是一个桌面,挂起到磁盘需要交换。 如果是服务器,依靠OOM 不是一个好主意,因为它会影响稳定性,没有任何理由。
[1]embedded式系统是唯一明显的例外,它们并不是特别常见(如果您正在处理embedded式系统,您将已经意识到这些要求)。
我认为AndreasM已经达到了这个目标(这是因为磁盘的性能不稳定)。可执行文件是需求分页的 – 所以在正常的操作中,几乎所有的可执行文件都会被放置在物理内存中。 但是,当内存不足时,内存不足而不足以运行内存不足的杀手,这些内存将从内存中逐出。 所以最后你会遇到网页被驱逐的情况 – 起初是没有问题的,因为它们最先被驱逐到最近才被使用,而且它会踢出你没有使用的网页。 但是,那么它会踢出你正在使用的,只是不得不马上回来。 捶打城市。
基本上,如果有些东西只使用了更多的内存,你可能会被OOM杀手踢,但你还没到那里。 正如一些人所说的,OOM杀手是不分青红皂白的,在正常操作中,避免内核恐慌比真正应该考虑使用的东西更加不可避免。 如果你有一些自定义的设置,我会考虑编写一些守护进程来监视空闲内存,并在接近完整时使用你select的策略来杀死。
(固定格式)