【问题标题】:Resident Set Size (RSS) limit has no effect驻留集大小 (RSS) 限制无效
【发布时间】:2011-03-03 21:22:04
【问题描述】:

以下问题发生在运行 Ubuntu 10.04 和 2.6.32-22-generic 内核的机器上:设置进程的驻留集大小 (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(用户进程限制)确实有效。

【问题讨论】:

    标签: python resources limits pam ulimit


    【解决方案1】:

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

    【讨论】:

    • 我已经用谷歌搜索了无数次手册页,但错过了有这个规定的那些。在我的机器上一个简单的“man getrlimit”就足够了。谢谢!
    【解决方案2】:

    相关限制 - 虚拟内存或地址空间 (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。进程的虚拟内存(地址空间)的最大大小,以字节为单位。

    这里很好地解释了驻留集和 VM 大小之间的区别 - What is RSS and VSZ in Linux memory management

    【讨论】:

    • 当我尝试使用RLIMIT_AS 时,即使分配(远)少于限制,我也会得到MemoryErrorSee this question.
    • @gerrit 这可能是因为RLIMIT_AS "包括进程可以访问的所有内存,包括已换出的内存、已分配但未使用的内存以及已分配的内存。来自共享库。” stackoverflow.com/a/21049737/1116842
    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

      • 在 Ubuntu 11.10 上,配置文件位置更改为:/etc/cgconfig.conf
      • 在 Ubuntu 10.04 上,我在尝试运行 sudo restart cgconfig 命令时收到错误消息 restart: Unknown job: cgconfig。 :(
      • 我没有根。我还能用这个吗?
      • 对于较新的 Ubuntu(我在 16.04 上尝试过):askubuntu.com/a/848022/65575 (cgconfigparser -l /etc/cgconfig.config)
      猜你喜欢
      • 1970-01-01
      • 2015-05-21
      • 2020-07-01
      • 2012-05-11
      • 2020-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-02-07
      相关资源
      最近更新 更多