针对可能导致操作系统崩溃的贪婪应用程序的内存限制

我用我的电脑进行科学编程。 它拥有健康的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)] 

*警告:可能有不良影响,通过iotoptop监控过程及时将其杀死。 如果没有,我会在你重启后见到你。

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更容易为未经启动的人配置。

决定决定:)祝你好运!