问题描述
我用我的电脑进行科学编程。它具有健康的RAM 8GB
和交换空间的12GB
。通常,随着我的问题变得越来越大,我超过了所有可用的RAM。似乎Ubuntu开始将所有内容加载到交换中,包括Unity和任何开放终端,而不是崩溃(这将是首选)。如果我没有及时赶上run-away程序,除了等待之外我什么都做不了 – 切换到命令提示符需要4-5分钟,例如。 Ctrl-Alt-F2
,我可以杀死违规的过程。
由于我自己的愚蠢超出了本论坛的范围,当我用完一个违规程序中的所有可用内存时,如何防止Ubuntu因颠簸而崩溃?
At-home实验*!
打开终端,启动python
,如果安装了numpy
,请尝试以下操作:
>>> import numpy
>>> [numpy.zeros((10**4, 10**4)) for _ in xrange(50)]
*警告:可能有不良影响,通过iotop
或top
监控过程及时将其杀死。如果没有,我会在你重启后见到你。
最佳解决方案
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限制会增加,因此请调整该列。
次佳解决方案
Cgroups应该允许您基于每个进程限制内存使用量。
https://en.wikipedia.org/wiki/Cgroups
http://www.mjmwired.net/kernel/Documentation/cgroups/memory.txt
科学计算是众所周知的内存密集型,通过在cgroup中沙盒化你的应用程序,其余的过程不应成为受害者,因为内存压力将得到缓解。
或者,VM可以用作一种硬限制,因为应用程序只能使用委托给虚拟机的内存,当然会牺牲性能。但是,与设置和维护cgroup相比,VM更容易为未经启动的人配置。
决定决定:)祝你好运!