2010-06-15 61 views
16

在运行Ubuntu 10.04的计算机上运行2.6.32-22-通用内核时发生以下问题:为进程的常驻集大小(RSS)设置限制不会似乎有任何影响。我目前使用下面的代码在Python中设置限制:常驻程序集大小(RSS)限制无效

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(用户进程限制)确实有效。

回答

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内核。

+1

我已经无数次地搜索了man页面,但错过了有这个规定的页面。我机器上的一个简单的“男人限制”就足够了。谢谢! – BrainCore 2010-06-15 09:27:40

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 
    

我发现我的过程与93M的RSS,当我问它只能使用50M,但是这不是一个对我来说是个问题,因为我的目标只是让程序进入页面。

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

+1

在Ubuntu 11上。10配置文件位置更改为:'/ etc/cgconfig.conf' – maxschlepzig 2012-05-31 19:05:13

+2

在Ubuntu 10.04上,当试图运行'sudo restart cgconfig'命令时,我收到错误消息'restart:Unknown job:cgconfig'。 ( – zrajm 2013-08-05 15:28:42

+0

)我没有root权限,我仍然可以使用它吗? – gerrit 2016-09-28 19:21:55

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

+1

当我尝试使用'RLIMIT_AS'时,即使分配(大)小于极限,我也会得到一个'MemoryError' [请参阅此问题](http: //stackoverflow.com/q/39755928/974555)。 – gerrit 2016-09-28 19:24:08