Предел установленного размера резидента (RSS) не влияет

Следующая проблема возникает на машине, на которой запущена Ubuntu 10.04, с ядром 2.6.32-22: установка предела для параметра Resident Set Size (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 сверху, я могу легко заставить процесс использовать 1 гб ОЗУ, а это значит, что предел не работает. Ограничения RSS не работают с этим ядром или дистрибутивом? Если это помогает, ресурс.RLIMIT_NPROC (лимит пользовательского процесса) работает.

    4 Solutions collect form web for “Предел установленного размера резидента (RSS) не влияет”

    Создайте man-страницу 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.

    Вы можете выполнить это с помощью групп. В моем блоге длинная версия, но короткая версия (протестированная на 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: ограничена ваша / программа
      

    Я наблюдал за своим процессом с помощью RSS 93M, когда я попросил его использовать только 50M, но для меня это не проблема, поскольку моя цель состояла в том, чтобы заставить программу перейти на страницу.

    cgclassify позволяет также привязывать ограничения к запущенному процессу. Примечание для RSS это относится только к памяти, выделенной после того, как ограничение вступит в силу.

    Я создал сценарий для ограничения использования памяти с помощью групп и менеджера групп, используемых для специальных команд и не нуждающихся в привилегиях root. См. https://unix.stackexchange.com/questions/134414/how-to-limit-the-total-resources-memory-of-a-process-and-its-children/174894#174894

    Связанный предел – виртуальная память или адресное пространство (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 . Максимальный размер виртуальной памяти процесса (адресного пространства) в байтах.

    Вот хорошее объяснение различий между Resident Set и VM – что такое RSS и VSZ в управлении памятью Linux .

    Python - лучший язык программирования в мире.