防止 Ubuntu 冻结,即使系统内存不足

Kla*_*ann 36 swap ram 14.04

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

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

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

两个问题:

  1. 操作系统如何假设任何事情都可能如此重要以至于可以停止听取用户输入?
  2. 我如何告诉 Ubuntu 永远不要交换基本服务并始终对用户输入做出反应,即使某些愚蠢的进程试图消耗比系统提供的资源更多的资源。

Kla*_*ann 7

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

1)早教

这是一个服务,它监视内存使用情况并在达到某个阈值时杀死消耗最多内存的进程(另请参阅有关 linux 内核中的 OOM 杀手的这个这个问题)

我已经用一个演示过程对其进行了测试,该过程不确定地以小块形式请求内存。这是我的第一印象:当我启动流氓进程时,它很快就吃光了我所有的 RAM。然后交换开始,系统变得无响应。几秒钟后,系统重新上线。Earlyoom 的日志显示它在内存和交换使用率都达到 90% 后杀死了内存消耗过程。

交换开始时仍然存在令人讨厌的延迟,并且在进程被终止后,其他进程的某些部分通常会保留在交换中,直到被请求为止,但这是一个开始。

2)只是禁用交换

我知道这是一个有争议的话题,但对于桌面系统,尤其是开发机器而言,它可能会不时发生进程试图吃掉你所有的内存,这是有道理的:没有交换,OOM 杀手就可以工作如预期。当内存不足时,它会找到最好的进程来杀死并摆脱它。没有延迟,没有延迟。

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


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

  • 我禁用了交换,我的系统直接从低内存(<100MB)进入冻结状态。如何判断 OOM 杀手是否已实际启用? (4认同)

hey*_*ema 0

尝试以下两件事之一:

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

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

请随时通知我。干杯,艾尔

  • 为什么,那有什么意义呢?如果我也吸收了该内存,那么更多的内存并不能阻止系统卡住。 (2认同)