我使用我的计算机进行科学编程。它拥有充足的8GB
RAM 和12GB
交换空间。通常,随着问题变得越来越大,我会超出所有可用 RAM。Ubuntu 似乎开始将所有内容加载到交换空间中,包括 Unity 和任何打开的终端,而不是崩溃(这本来是更理想的情况)。如果我没有及时发现失控程序,我只能等待 - 切换到命令提示符需要 4-5 分钟,Ctrl-Alt-F2
在那里我可以终止有问题的进程。
由于我自己的愚蠢行为超出了本论坛的讨论范围,当我用尽一个有问题的程序的所有可用内存时,如何防止 Ubuntu 因抖动而崩溃?
在家进行实验*!
打开一个终端,启动python
,如果已经numpy
安装,请尝试以下操作:
>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]
* 警告:可能会产生不利影响,请通过iotop
或监控该进程top
,以便及时终止它。如果没有,我们将在重启后与您见面。
答案1
shell 内置ulimit
允许您限制资源。对于您的情况,要限制 shell(及其子级)中的内存使用,请使用ulimit -v
。
设置内存限制为 100 MB (100000 KB) 的演示:
$ ulimit -v
unlimited
$ python -c '[ "x" * 100000000 ]'
$ ulimit -v 100000
$ python -c '[ "x" * 100000000 ]'
Traceback (most recent call last):
File "<string>", line 1, in <module>
MemoryError
据观察,使用ps uww -C script-name-here
Python 至少需要 29MB 内存(VSZ 列)。随着 Python 脚本需要更多内存,RSS 限制也会增加,因此请调整该列。
答案2
Cgroups 应该允许您根据每个进程限制内存使用量。
https://en.wikipedia.org/wiki/Cgroups
http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt
众所周知,科学计算是内存密集型的,通过在 cgroup 中对应用程序进行沙盒处理,其余进程不会成为受害者,因为内存压力将得到缓解。
或者,VM 可以用作一种硬限制,因为应用程序只能使用委托给虚拟机的内存,当然,这会以牺牲性能为代价。但是,与设置和维护 cgroup 相比,VM 对于初学者来说更容易配置。
决定决定:)祝你好运!