当前位置: 首页>>技术教程>>正文


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

, , ,

问题描述

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

*警告:可能有不良影响,通过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 "<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更容易为未经启动的人配置。

决定决定:)祝你好运!

参考资料

本文由Ubuntu问答整理, 博文地址: https://ubuntuqa.com/article/7218.html,未经允许,请勿转载。