即使系统内存不足也可以防止Ubuntu冻结


24

有时,我要处理大量的数据转储,我想保留在内存中进行处理。有时我会错误地计算程序将产生的内存量,或者调试器将内存使用量乘以超出可用内存的倍数。

每当我启动一个需要大量内存的进程时,这都是我对健全的操作系统的期望:尝试吃掉所有可用内存,然后很好地请求其他一些非必需进程放弃一些不需要的内存,然后写交换。

这就是Ubuntu为我做的事情:吃掉所有的内存,然后要求操作系统交换所有基本服务(gnome会话,终端,键盘),然后冻结并等待我拔下电源插头。

两个问题:

  1. 操作系统如何假设任何重要的事情都如此重要,以至于可以停止监听用户输入了?
  2. 我该如何告诉Ubuntu不要交换必要的服务,并且始终对用户输入做出反应,即使某些愚蠢的进程试图吞噬系统提供的资源以外的资源。

您已经安装了多少RAM?您的交换尺寸是多少(在终端中,键入swapon以进行查找)?干杯,铝
heynnema '16

3
16GB内存和16GB交换空间。但这不是重点,无法通过添加更多内存来解决此问题。
克拉曼2013年

1
尝试以下两种方法之一。1)将swappiness设置更改为10,即:vm.swappiness = 10/etc/sysctl.conf中。在此处搜索swappiness以获取有关它的更多信息。2)如果swappiness没有帮助...即使您可能不想...将交换文件的大小增加到1.5x16G,看看是否有帮助。让我发布。干杯,铝
heynnema'9

1
@Klamann我同意添加更多交换不会解决问题。一旦您的程序损坏了,并且消耗了所有RAM + SWAP,则添加额外的SWAP只会延迟不可避免的情况。
WinEunuuchs2Unix

1
正如我所说,@ WinEunuuchs2Unix vm.swappiness=10需要添加到sysctl.conf中。有经验的人甚至可以即时使用sysctl命令来设置vm.swappiness = 10,而无需编辑sysctl.conf文件。干杯,Al ps:等待OP回应。
heynnema

Answers:


5

我仍然没有解决问题的方法,但是我可以提供其他人可能会感兴趣的两种解决方法:

1)提早

这是手表内存使用和终止进程消耗达到一定的阈值时,最大内存(又见服务这个这个关于Linux内核中的OOM杀手问题)

我已经通过演示过程对其进行了测试,该演示过程无限期地请求小块内存。这是我的第一印象:当我开始流氓进程时,它很快就耗尽了我所有的RAM。然后开始交换,系统变得无响应。几秒钟后,系统重新联机。Earlyoom的日志显示,它在内存和交换使用率均达到90%之后终止了内存消耗过程。

交换开始时仍然存在烦人的滞后,并且在进程被杀死之后,其他进程的某些部分通常仍处于交换状态,直到被请求为止,但这是一个开始。

2)只是禁用掉期

我知道这是一个有争议的主题,但是对于台式机系统(尤其是开发机器)而言,可能会不时发生进程试图耗尽所有内存的情况,这很有意义:没有交换,OOM杀手就可以工作如预期。当您的内存不足时,它会找到最佳的杀死进程并摆脱它。没有滞后,没有延迟。

您可以使用禁用当前会话的交换,sudo swapoff -a使更改永久生效


解决该问题的正确方法当然是在主内存耗尽时系统保持响应,并开始交换内存,就像没有明天一样,但这似乎不会很快发生。


1
我已禁用交换功能,并且系统直接从内存不足(<100MB)变为冻结。如何确定OOM杀手是否已启用?
Michael

0

尝试以下两种方法之一:

1)将swappiness设置从其默认设置60更改为10,即:将vm.swappiness = 10添加到/etc/sysctl.conf(在终端中,键入sudo gedit /etc/sysctl.conf),然后重新引导系统。在此处搜索swappiness以获取有关它的更多信息。

2)如果swappiness没有帮助...即使您可能不想...将交换文件的大小增加到1.5x16G,然后查看是否有帮助。

让我发布。欢呼声


我已经设置了一个VM来运行一些测试,因为每隔几秒钟重新启动一次OS确实很烦人。Ubuntu 16.04、2GB内存,3GB交换空间,20GB磁盘。然后,我运行了一个占用大量内存的脚本:使用默认swappiness(60),系统冻结,几分钟后,由于恢复时间太短,我将其关闭。使用swappiness 10,系统冻结几秒钟,然后接受输入,但您无法启动任何进程(例如top,杀死内存消耗)。一分钟左右后,该过程被终止。尚不完美,但我们之间的距离越来越近。
克拉曼2016年

保持联系。VM不会真正模拟您现实生活中的操作系统,但可以让您使用设置。如果交换对您的问题有帮助,我会很好奇。干杯,铝
heynnema '16

啊好。进展!阅读有关交换性的内容。您可以稍微玩一下该值。干杯,铝
heynnema

系统冻结时使用了多少交换空间?干杯,铝
heynnema

2
为什么,这有什么意义呢?如果我也占用更多内存,更多的内存将不会阻止系统卡住。
克拉曼

0

我解决了类似的问题。我不知道我的经历是否适合您...

最近,我发布了有关如何在从USB引导的环回LVM设备上安装linux的指南(因此无需在内部磁盘上安装grub,而将其保留为原始状态)。下面是指南:https://github.com/DareDevil73/linux-on-loopback-usb

然后,我因高内存负载而陷入冻结问题,并观察到异常的交换空间使用情况(所有RAM都被占用,并且交换使用率接近于零)。显然,LVM交换分区已安装并且可以正常工作,但是我不知道为什么内核没有按预期使用它。

我尝试了替代解决方案。我创建了一个交换环回文件(不是LVM),冻结不再了。现在,交换文件将按原样使用,并且操作系统永不冻结!

请查看https://github.com/DareDevil73/linux-on-loopback-usb#known-issues以获得更深入的信息。


请将链接扩展为答案。
Konrad Gajewski
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.