如何防止我的系统由于 RAM 使用率过高而崩溃或变得不可用?

如何防止我的系统由于 RAM 使用率过高而崩溃或变得不可用?

有时当我使用 Lubuntu 17.10 - 完全更新时,我的 RAM 使用率会达到 100%,系统变得无法使用,如果我“幸运”的话,我可以每 10 秒移动鼠标约 1 个像素……这几乎使我无法做任何事情,甚至无法关闭应用程序。然后我不得不使用笔记本电脑上的电源按钮。

我使用的是 2013 年末的 macbook pro retina,安装了几乎全新的 Lubuntu 17.10。

到目前为止,当我打开 spyder3 并加载了太大的文件时,就会发生这种情况。当我在 Firefox 中单击此链接时也会发生这种情况(警告:可能会崩溃)http://stats.oecd.org/restsdmx/sdmx.ashx/GetData/SNA_TABLE1。我甚至在达到 100% 使用率之前关闭了选项卡,但它只是继续达到 100% 并崩溃了。我之所以注意到这一点,是因为我关闭了选项卡并在 spyder3 中看到了 RAM 使用情况(我没有运行任何 python3 脚本)。

有办法防止这种情况吗?也许可以确保特定数量的 RAM 只能由操作系统使用?

答案1

如果某个进程占用了太多内存,那么系统应该通过 OOM killer 来保护自己,这是任何 Linux 系统的标准功能。

正如迄今为止最好的答案所述OOM 终止程序如何决定首先终止哪个进程?

如果内存被进程耗尽,以至于可能威胁系统稳定性,那么 OOM killer 就会出现。

注意:OOM Killer 的任务是持续终止进程,直到释放足够的内存以确保内核尝试运行的其余进程能够顺利运行。

OOM Killer 必须选择最佳进程来终止。此处的最佳进程是指终止后将释放最大内存且对系统最不重要的进程。

主要目标是终止最少数量的进程,以最大限度地减少造成的损害,同时最大限度地释放内存量。

为了实现这一点,内核为每个进程维护一个 oom_score。您可以在 /proc 文件系统的 pid 目录下查看每个进程的 oom_score。

$ cat /proc/10292/oom_score

任何进程的 oom_score 值越高,在内存不足的情况下被 OOM Killer 杀死的可能性就越大。

如果您的系统崩溃,那么我建议通过调整进程的 oom_score 来微调 OOM 策略。

OOM killer 不太可能被禁用,但是为了确保万无一失,请检查此命令是否返回0

$ sudo sysctl vm.overcommit_memory
vm.overcommit_memory = 0

参考:

  1. http://www.oracle.com/technetwork/articles/servers-storage-dev/oom-killer-1911807.html
  2. https://superuser.com/questions/1150215/disabling-oom-killer-on-ubuntu-14-04/1150229
  3. https://unix.stackexchange.com/questions/153585/how-does-the-oom-killer-decide-which-process-to-kill-first
  4. https://www.kernel.org/doc/Documentation/sysctl/vm.txt

答案2

您的问题可能是由系统“抖动”引起的 – 一次将许多页面的内存移入和移出交换空间,而没有留下时间让实际进程执行。

如果您希望杀死占用过多内存的进程,而不是让整个系统运行缓慢,您可以禁用交换。运行sudo swapoff -a将实现此目的,直到重新启动;要永久禁用交换,您需要编辑/etc/fstab以删除交换文件/交换分区,方法是删除或注释掉swap第三列中的行。例如,我的/etc/fstab看起来有点像这样:

# <file system> <mount point>   <type>  <options>       <dump>  <pass>
/dev/mapper/ubuntu--vg-root /               ext4    errors=remount-ro 0       1
# /boot was on /dev/sda1 during installation
UUID=fdedeca9-dafe-1a05-0866-7502fda1a7ea /boot           ext2    defaults        0       2
/dev/mapper/ubuntu--vg-swap_1 none            swap    sw              0       0

要禁用交换,我会注释掉最后一行(通过在行#首添加一个井号),然后重新启动。请确保不要修改文件的其他任何部分,否则可能会导致系统无法启动。

警告:如果您禁用交换并且没有足够的物理内存用于基本系统服务,则 OOM 杀手可能会决定杀死其中一个并导致系统崩溃或变得无法使用(问题是您想要避免的)。

答案3

创建交换分区或交换文件。它们就像 RAM,但在 HDD 上,因此速度要慢得多。当您没有足够的 RAM 时,系统会将数据存储到 HDD 而不是 RAM。您需要指定它的大小。通常建议您将其设置为与 RAM 大小大致相同。

交换文件更容易制作,但不允许您休眠到 HDD。

交换文件:https://www.howtoforge.com/ubuntu-swap-file

如果您已经安装了系统并且所有硬盘空间都已分区,则交换分区会更难创建,但这允许休眠。

交换分区:系统安装后如何添加交换分区?

答案4

@Josh 回答:

我认为所描述的问题(“系统变得不可用,如果我够幸运的话,我可以每 10 秒移动鼠标 1 个像素”)可能是由于系统抖动引起的,系统试图一次交换许多页面。禁用交换应该会导致内存需求大的应用程序被终止,而不是使整个系统停止运行。

这解决了我的问题。

我在安装 Lubuntu 时有一个交换区,但后来用 gparted 删除了它。我没有编辑 /etc/fstab,这就是导致问题的原因。正确删除交换区后,OOM 杀手开始按预期工作。

相关内容