Существует множество вопросов и ответов об ограничении ресурсов одного процесса, например, RLIMIT_AS может использоваться для ограничения максимального объема памяти, выделяемой процессом, который можно рассматривать как VIRT в подобии top
. Подробнее по теме, например здесь. Есть ли способ ограничить объем памяти, который конкретный процесс может использовать в Unix?
setrlimit(2)
Документация гласит:
Дочерний процесс, созданный с помощью fork (2), наследует ограничения ресурсов своего родителя. Пределы ресурсов сохраняются в execve (2).
Это следует понимать следующим образом:
Если процесс имеет RLIMIT_AS, например, 2 ГБ, он не может выделить больше памяти, чем 2 ГБ. Когда он порождает дочерний элемент, ограничение адресного пространства в 2 ГБ будет передано дочернему элементу, но отсчет начинается с 0. 2 процесса вместе могут занимать до 4 ГБ памяти.
Но что может быть полезным для ограничения общего объема памяти, выделенной целым деревом процессов?
Ответы:
Я не уверен, отвечает ли это на ваш вопрос, но я нашел этот Perl-скрипт, который утверждает, что делает именно то, что вы ищете. Скрипт реализует свою собственную систему для обеспечения ограничений путем пробуждения и проверки использования ресурсов процесса и его дочерних элементов. Это, кажется, хорошо документировано и объяснено, и было недавно обновлено.
Как сказал slm в своем комментарии, cgroups также могут быть использованы для этого. Возможно, вам придется установить утилиты для управления cgroups, при условии, что вы находитесь в Linux, вы должны искать
libcgroups
.Убедитесь, что
$USER
ваш пользователь.Ваш пользователь должен иметь доступ к настройкам памяти cgroup в
/sys/fs/cgroup/memory/myGroup
.Затем вы можете установить ограничение, скажем, 500 МБ, выполнив следующее:
Теперь давайте запустим Vim:
Теперь процесс vim и все его дочерние элементы должны быть ограничены использованием 500 МБ ОЗУ. Тем не менее , я думаю, что это ограничение относится только к оперативной памяти, а не подкачки. Как только процессы достигнут предела, они начнут обмениваться. Я не уверен, если вы можете обойти это, я не могу найти способ ограничить использование свопа с помощью cgroups.
источник
sudo yum install libcgroup-tools
Я создал скрипт, который делает это, используя cgmanager, который используется в Ubuntu. Одним из преимуществ является то, что для этого не требуется root-доступ. Обратите внимание, что управление cgroup немного специфично для дистрибутива, так что я не знаю, работает ли это на дистрибутивах, которые используют управление cd группой systemd.
Использование: сохранить как
limitmem
на вашем пути и сделать его исполняемым. Тогда беги напрlimitmem 1G command...
. Это ограничивает фактически используемую память. Если это будет достигнуто, убийца OOM уничтожит процесс или одного из его дочерних элементов, но не случайное событие, которое не имеет ничего общего с этой командой.источник
cgm
руководство, это было полезно/unix//a/536046/4319 :
В любом системном дистрибутиве вы также можете использовать cgroups косвенно через systemd-run. Например, для вашего случая ограничения
pdftoppm
до 500M RAM, используйте:...
источник