Лимит набора резидентов (RSS) не имеет никакого эффекта

StackOverflow https://stackoverflow.com/questions/3043709

Вопрос

Следующая проблема возникает на машине, запущенной Ubuntu 10.04 с 2,6,32-22-обзорный ядр: установка пределе для размера резидентов (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 не работают с этим ядром или дистрибутивом? Если это поможет, Resource.RLIMIT_NPROC (лимит пользовательского процесса) работает.

Это было полезно?

Решение

Формируйте The Getrlimit Manpage:

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.

Похоже, это просто не поддерживается на ядре 2,6 Linux 2.6.

Другие советы

Вы можете выполнить это, используя cgroups. Длинная версия на моем блог, но короткая версия (проверена на 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
    

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

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

Связанный предел - виртуальная память или адресное пространство (Rlimit_as) - работает работает. Это позволяет ограничить память Python Process и Subprocesses без внешних инструментов.

>>> 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 - Что такое RSS и VSZ в управлении памятью Linux.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top