以下问题发生在一台机器上运行Ubuntu的10.04与2.6.32-22的一般性核:设置限制的居民设置的尺寸(RSS)的一个过程似乎不具有任何效果。我目前设置限制在Python与下列代码:

import resource
# (100, 100) is the (soft, hard) limit. ~100kb.
resource.setrlimit(resource.RLIMIT_RSS, (100, 100))
memory_sink = ['a']*10000000   # this should fail

该列表中,memory_sink,成功的每一个时间。当我检查RSS使用有顶,我可以很容易地得到处使用1gb RAM,这意味着限制是没有工作。做RSS限制不起作用这一核心或发行版?如果有帮助,资源。RLIMIT_NPROC(用户过程的限制)的工作。

有帮助吗?

解决方案

形成getrlimit手册页:

RLIMIT_RSS
Specifies the limit (in pages) of  the  process's  resident  set
(the  number of virtual pages resident in RAM).  This limit only
has effect in Linux 2.4.x, x < 30, and there only affects  calls
to madvise(2) specifying MADV_WILLNEED.

看来这只是不支持Linux内核2.6。

其他提示

您可以使用 cgroup 来完成此操作。长版本在我的 博客, ,但简短版本(在 Ubuntu 11.04 上测试)是:

  • 安装 cgroup-bin 包裹。

  • 编辑 /etc/cgconfig.config 并创建一个内存有限的组。例如,我补充说:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • 跑步

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

当我要求它仅使用 50M 时,我用 93M 的 RSS 观察了我的进程,但这对我来说不是问题,因为我的目标只是让程序进行分页。

cgclassify 也可以让您对正在运行的进程附加限制。请注意,对于 RSS,这仅适用于限制生效后分配的内存。

一个相关限制的虚拟存储器或地址空间(RLIMIT_AS)-不会的工作。这种允许的限制python过程和子进程的存储器没有外部工具。

>>> size = 50*1024*1024 # In bytes
>>> resource.setrlimit(resource.RLIMIT_AS, (size, resource.RLIM_INFINITY))
>>> a = 'a' * size
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
MemoryError

人页:

RLIMIT_AS.最大尺寸的进程的虚拟存储器(地址空间)字节。

这是一个很好的解释之间的差的居民设置和VM大小 什么是RSS和VSZ在Linux存管理.

我创建了一个脚本来限制的存储器的使用采用cgroups和该管理器,用于临时命令,而不是需要根本的权限。看看 https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top