是否可以更早地干预OOM杀手?


34

我尝试将开发系统调整为最大的可靠性。我禁用了交换功能,因为对于GUI使用,它主要使计算机无响应,从而不再可用。但是,如果攻击性的应用吞噬了内存,那么似乎有一些机制可以提高速度,从而最大限度地利用内存。没有硬盘交换操作,但是系统同样没有响应。因此,我想让OOM杀手kick脚,然后系统对内存增益进行任何特殊的努力。例如,如果可用物理内存少于100 MB,是否可以配置OOM杀手执行操作?


2
我认为真正的问题是,没有足够的内存开始。除非没有ram,否则您将不使用swap。通过关闭swap ...,您的ram用完了,没有页面可以寻呼到的地方。这导致丑陋的事情发生。您的系统似乎设置不正确,没有任何调整可以解决该问题。
Journeyman Geek

8
我不同意 开发和“电力使用”通常涉及实验用途。例如,当使用命令行图像处理工具时,没有规格说明其操作占用的内存与图像大小有关。因此,我只是运行一下。而且我不希望它会使我的整个机器变得无用。对于单个实验,我可以使用ulimit使其保持安全,但是对于有时需要进行大量操作的整个系统操作而言,遏制一个过程并不是那么有用,而是明确地为整个机器提供“人寿保险”。
dronus 2012年

1
使用交换时,系统可能会暂停,这一事实值得怀疑。您的计算机使用交换引起内存不足。交换速度变慢,原因是磁盘访问速度慢。由于???,磁盘访问速度很慢。它的问题一直持续下去。不仅仅是您对ram的了解不足。由于其他原因,您不能使用一种方法来消除它。
Journeyman Geek

7
@JourneymanGeek,您离开了左场。与ram,period相比,磁盘速度较慢,因此大量交换总是使系统陷入瘫痪。当然,他内存不足是因为他尝试运行使用大量内存的程序。问题是内存不足时该怎么办?杀死猪,或者由于没有足够的内存用于磁盘缓存而减慢速度。
psusi 2012年

2
@TomWijsman,磁盘IO的速度比内存IO慢许多个数量级,因此使用磁盘交换始终意味着速度大大降低。有时(尤其是在公羊价格昂贵,因此大多数人都没有的时候),胜于根本无法做您想做的事情。这些天,磁盘SO比RAM慢得多,并且RAM是足够便宜,大多数人有很多,因此在个别情况下,他们意外地运行一些使用更多的内存比他们,往往越好放弃不是花1000要做的时间很长。
psusi 2012年

Answers:


36

我也为这个问题而苦恼。我只是希望我的系统无论如何都可以保持响应,并且我宁愿丢失进程也不愿等待几分钟。使用内核oom Killer似乎无法实现这一目标。

但是,在用户空间中,我们可以做任何我们想做的事情。所以我写了Early OOM Daemon(https://github.com/rfjakob/earlyoom),一旦可用RAM低于10%,它将杀死最大的进程(通过RSS)。

如果没有Earlyoom,通过多次启动http://www.unrealengine.com/html5/可以很容易地锁定我的机器(8GB RAM)。现在,有罪的浏览器选项卡在事情失控之前就被杀死了。


3
感谢您挠痒痒!到目前为止,很喜欢Earlyoom。
Thomas Ferris Nicolaisen

1
刚发现Android在很长一段时间内都可以做到这一点。我不确定是否正在使用像您这样的自定义代码。
德鲁努斯

1
我现在正在测试earlyoom,在首次触发测试中效果很好。我只是想知道为什么不能通过内核配置或系统工具来实现。
德鲁努斯

12

内核的默认策略是,只要有可用的物理内存,应用程序就可以继续分配虚拟内存。直到应用程序触摸分配给它们的虚拟内存后,才真正使用物理内存,因此应用程序可以分配的内存比系统要多得多,然后再开始使用它,导致内核内存不足并触发内存不足(OOM)杀手。但是,在终止进程之前,它已导致磁盘高速缓存被清空,这使系统响应一段时间,直到高速缓存重新填充为止。

您可以通过将默认值2写入来更改默认策略以禁止内存过量使用/proc/sys/vm/overcommit_memory。默认值为/proc/sys/vm/overcommit_ratio50,因此内核将不允许应用程序分配ram + swap的50%以上。如果没有交换,则内核将不允许应用程序分配超过50%的内存,其余50%留给缓存。这可能有点过分,所以您可能希望将此值增加到大约85%,以便应用程序最多可以分配85%的内存,而将15%留给缓存。


1
在没有更可靠的系统的情况下,无法从没有理论背景的默认值更改这些值,您只能使用适当的统计数据来证明该更改是合理的。仅仅因为您可以更改它并不意味着您应该这样做。如果您经常处于内存不足的情况下,这意味着您使用的内存多于现有的内存,应该购买更多的内存,这并不意味着您应该摆弄自己的设置并杀死随机的应用程序。打扰您的日常工作或引入腐败,这实际上不是要走的路...
Tamara Wijsman 2012年

3
@TomWijsman,这个问题清楚地表明,他并非一直处于记忆不足的状态。他只是有时会运行一条占用大量内存的命令。耗尽内存并不是唯一的解决方案。其他可能的解决方案包括找到更好的方法来利用您拥有的内存,或者只是不做任何需要那么多内存的事情。问题很清楚,后者比出去购买更多的公羊更容易接受。
psusi 2012年

问题中的哪一行清楚说明了这一点?我看到了相反的说法I disabled swap, because for GUI usage it mostly renders the machine unresponsive in such a way not useable anymore.。他提到了GUI,而您假设他正在运行命令。购买更多的内存是第一个解决方案,您自己使用较少的内存是第二个解决方案,最后一个解决方案是通过摆弄稳定的默认值来使系统不稳定。不必从字面上回答这个问题,因此我看不到您必须在评论中打扰我们两个人的问题。兰特没有帮助...
塔玛拉·维斯曼

4
嘿,这个答案听起来很酷。不幸的是,“提交”似乎是指虚拟内存需求,这是由应用程序程序员估计的。例如我的(没有交换)的桌面上运行,所以'commit'ted所使用的约400 2000MB的物理内存,但是1600MB /proc/meminfoCommitted_AS状态。在某些应用程序运行的情况下,此值很容易超过物理内存,因此很难以此设置可行的限制。
德罗努斯2012年

3
尝试之前保存您的工作!:PI一切立即失败(bash,窗口管理器等)。
jozxyqk 2015年

8

对我来说,设置vm.admin_reserve_kbytes = 262144可以完成此任务。在系统完全不响应之前,OOM杀手进行干预。


1
我喜欢这个主意,但这是否意味着您有从未使用过的256MiB物理内存?
杰罗姆Pouiller

1
256MiB将用于缓存。缓存确实很重要,这不仅仅是运行得更快,如果没有足够的内存用于缓存,系统将根本无法工作。可以将每个正在运行的程序的代码从内存中卸载,因为它们已被映射并可以从磁盘读取。如果没有缓存,则每个任务切换都需要读取磁盘,并且系统将变得完全无响应。
Michael Vigovsky

4

其他答案都有很好的自动解决方案,但我发现也可以SysRq在事情失控时启用密钥。使用该SysRq键,您将手动向内核传递消息,并且SysRQ + REISUB即使用户空间已完全冻结,也可以执行诸如安全重启(带有)的操作。

要允许内核侦听请求,请设置kernel.sysrq = 1或仅启用您可能会与位掩码一起使用的功能(在此处记录)。例如,kernel.sysrq = 244将启用安全重启所需的所有连击,以及使用手动调用OOM杀手SysRq + F


-2

低内存条件和OOM杀手无法达到可靠性。

在壁橱里组织一个聚会并将“清理我的壁橱”放在您的小播放列表上是错误的。

是否可以更早地干预OOM杀手?

这样做会带来意想不到的副作用,因为您无法控制被杀死的内容。

我尝试将开发系统调整为最大的可靠性。

最大的可靠性包括测试您的系统并基于这些测试来改进您的系统。

只是调整随机的东西并不会带你到任何地方...

我禁用了交换功能,因为对于GUI使用,它主要使计算机无响应,从而不再可用。但是,如果攻击性的应用吞噬了内存,那么似乎有一些机制可以提高速度,从而最大限度地利用内存。

由于内存不足,禁用交换不会改善行为反之亦然

为了在这种情况下提高可靠性,请添加更多的内存,以使您的系统具有更高的响应速度,并且在没有用户意图的情况下不会杀死任何随机进程。您不应该在内存不足的情况下使用这种机制,尤其是在开发环境中……

没有硬盘交换操作,但是系统同样没有响应。

内存不足的情况确实会导致无响应,无论您是否进行了交换。

因此,我想让OOM杀手kick脚,然后系统对内存增益进行任何特殊的努力。

如上文所述,付出特殊的努力只会弊大于利。相反,您可以杀死不需要的进程,但是我想您不能这样做,因此OOM将杀死您需要的进程。

例如,如果可用物理内存少于100 MB,是否可以配置OOM杀手执行操作?

可能会,但是,如果您仅购买一些额外的内存,而这些天实际上并不需要太多钱,那么您可以获得更高的投资回报。如果您继续在内存不足的情况下工作,那么从长远来看,您会陷入困境。OOM就像法警一样,对您没有帮助,对操作系统有帮助...


7
当然,禁用交换可以改善行为,因为OOM不会破坏磁盘,而是启动并杀死了内存消耗。用完ram并不是问题(添加更多只是意味着您必须更加努力才能用完)。问题是当用尽时该怎么办。您希望OOM杀死猪,从而缓解内存不足的情况。
psusi 2012年

7
因为杀死一个试图使用比您更多的内存的应用程序比使整个系统瘫痪更可取。在理想环境中,您将拥有无限的内存并且永远不会耗尽,但是实际上,有时您会无意中耗尽内存,宁愿被告知“内存不足”,也不愿让系统陷入瘫痪。
psusi 2012年

5
根据购买的数量,购买一些额外的内存可能会解决一些问题。但这并不会改变使用量可能会超出预期数量的事实。因此,我希望应用程序失败,但不要让那些情况下的系统失败。一些示例:处理一个充满压缩图像的文件夹,其中大多数为“正常”大小,但其中一些确实很大。一个小错误可能导致死循环,导致内存失控吞噬1GB / s。在文本编辑器中意外打开视频文件。。通常这与喜欢干的鼠标和快死了UI,直到OOM踢症状两端
dronus

6
@TomWijsman也有几乎死循环,因为有些算法在平均情况下表现为线性,而在最坏情况下表现为指数,具体取决于输入数据。如果鼠标出现抖动,点击和键盘输入显示一分钟的延迟,我将无法发送终止信号。我通常会切换到文本模式终端,然后等待几分钟才能继续进行登录,以发出kill盲目的输入。
dronus 2012年

7
我也不会杀死任何会死掉的应用程序。考虑一个具有2GB物理+ 2GB交换的系统。快速耗尽物理内存的应用程序也很容易吃掉交换。在使系统在几分钟到几小时内无响应之后,它只会在以后死掉。那么,为什么不在GUI操作出现问题之前迅速杀死它呢?许多进程用10mb来完成所有工作,有些需要1gb,有些罕见需要10gb,那就是生命。
德罗努斯2012年
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.