Размер резидентного набора (RSS) не влияет - PullRequest
16 голосов
/ 15 июня 2010

Следующая проблема возникает на компьютере под управлением 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 с помощью top, я легко могу заставить процесс использовать 1 ГБ ОЗУ, что означает, что ограничение не работает.Ограничения RSS не работают с этим ядром или дистрибутивом?Если это помогает, то resource.RLIMIT_NPROC (ограничение пользовательского процесса) работает.

Ответы [ 4 ]

19 голосов
/ 16 июня 2011

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

12 голосов
/ 15 июня 2010

Форма справочной страницы 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.

3 голосов
/ 04 ноября 2015

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

Вот хорошее объяснение разницы между резидентным набором и размером виртуальной машины. * Что такое RSS и VSZ в управлении памятью Linux

1 голос
/ 18 декабря 2014

Я создал скрипт для ограничения использования памяти с помощью 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

...