Подтвердить что ты не робот

Предел установленного размера резидента (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 (лимит пользовательского процесса) работает.

4b9b3361

Ответ 1

Создайте man-страницу getrlimit:

RLIMIT_RSS
Specifies the limit (in pages) of  the  process  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.

Ответ 2

Вы можете выполнить это с помощью групп. Длинная версия находится в моем блоге, но короткая версия (протестированная на Ubuntu 11.04):

  • Установите пакет cgroup-bin.

  • Измените /etc/cgconfig.config и создайте группу с ограниченной памятью. Для Я добавил:

    group limited {
      memory {
        memory.limit_in_bytes = 50M;
      }
    }
    
  • Run

    $ sudo restart cgconfig
    $ sudo chown -R jlebar /sys/fs/cgroup/memory/limited
    $ cgexec -g memory:limited your/program
    

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

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

Ответ 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:

RLIMIT_AS. Максимальный размер виртуальной памяти процесса (адресного пространства) в байтах.

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