针对可能导致操作系统崩溃的贪婪应用程序的内存限制
我用我的电脑进行科学编程。 它拥有健康的8GB
内存和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
监控过程及时将其杀死。 如果没有,我会在你重启后见到你。
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 "", line 1, in 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更容易为未经启动的人配置。
决定决定:)祝你好运!