如果使用过多 RAM,即使关闭交换,系统也会挂起

如果使用过多 RAM,即使关闭交换,系统也会挂起

当我运行一段占用过多 RAM 的 Python 代码时,我的计算机会开始严重交换,以至于我不得不进行硬重启。为了解决这个问题,我关闭了交换,以为 OOM 杀手会介入。然而,我仍然遇到完全相同的症状!也就是说,一旦所有 RAM 都用完,我就能听到硬盘震动的声音,电脑死机了,我不得不进行硬重启。

可能发生什么情况?我该如何解决?

我的系统运行的是 Ubuntu 14.04.2 LTS、3.13.0-43-generic #72-Ubuntu SMP Mon Dec 8 19:35:06 UTC 2014 x86_64 x86_64 x86_64 GNU/Linux,配备 8GB RAM。

我的 /etc/fstab 显示

# / was on /dev/sda1 during installation
UUID=80919e96-e83b-4c88-b30e-8673e1faa3b4 /               ext4    errors=remount-ro 0       1
# swap was on /dev/sda5 during installation
#UUID=68064725-c1bb-4293-b8d1-45b2a42fb7b4 none            swap    sw              0       0

更多细节

tail -n+1 /proc/sys/vm/overcommit_*
==> /proc/sys/vm/overcommit_memory <==
0

==> /proc/sys/vm/overcommit_ratio <==
50

cat /proc/sys/vm/oom_kill_allocating_task
0

示例代码

很抱歉,我不知道如何制作一个最简洁的 Python 示例来展示这个问题。然而,这是非最简洁的代码,它肯定 http://paste.ubuntu.com/11621823/。只需更改代码中的“path”值并运行它。在我的系统上,它会耗尽所有 RAM,然后完全冻结系统。

答案1

你的问题是你自己的python code,与 无关swap

Swap当内存负载增加时,操作系统会使用空间。然后,当前未使用的进程将移动到交换空间(分区)。这样可以为当前正在运行的进程释放更多内存。当移动到交换的进程被使用时,它将从交换区域移回内存。

这样,交换有助于解决运行某些程序所需的内存大于可用内存量的情况。

由于您关闭了交换,这不会解决您的问题,而只会增加问题。我能想到的唯一解决方案是优化您的 Python 代码以使用更少的内存或增加机器的内存。

此外,如果您能将您的代码放在这里以便人们能够帮助优化它那就更好了。

相关内容