19

在使用 2.6.32-22-generic 内核运行 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

4 回答 4

21

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

  • 安装cgroup-bin软件包。

  • 编辑/etc/cgconfig.config和创建内存有限的组。例如,我添加了:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • $ sudo 重启 cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

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

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

于 2011-06-15T23:13:08.997 回答
15

形成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 上不受支持。

于 2010-06-15T08:53:19.580 回答
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

手册页

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

这里很好地解释了驻留集和 VM 大小之间的区别 - Linux 内存管理中的 RSS 和 VSZ 是什么

于 2015-11-04T15:04:41.487 回答
1

我使用 cgroups 和 cgroup 管理器创建了一个脚本来限制内存使用,可用于临时命令并且不需要 root 权限。请参阅https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894

于 2014-12-18T17:07:04.293 回答