驻留集大小(RSS)限制无效

时间:2010-06-15 08:43:31

标签: python resources limits pam ulimit

在运行带有2.6.32-22通用内核的Ubuntu 10.04的计算机上会出现以下问题:设置进程的驻留集大小(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每次都成功。当我使用top检查RSS使用情况时,我可以轻松地使用1gb的RAM进程,这意味着限制无效。 RSS限制不适用于此内核或发行版吗?如果有帮助,resource.RLIMIT_NPROC(用户进程限制)确实有效。

4 个答案:

答案 0 :(得分:19)

您可以使用cgroups完成此操作。长版本在我的blog上,但是短版本(在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注意事项仅适用于限制生效后分配的内存。

答案 1 :(得分:12)

形成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似乎不支持。

答案 2 :(得分:3)

相关限制 - 虚拟内存或地址空间(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

来自man page

  

<强> RLIMIT_AS 即可。进程的虚拟内存(地址空间)的最大大小(以字节为单位)。

以下是驻留集与虚拟机大小之间差异的一个很好的解释 - What is RSS and VSZ in Linux memory management

答案 3 :(得分:0)

我使用cgroups和cgroup manager创建了一个限制内存使用的脚本,可用于ad-hoc命令而不需要root权限。见https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894