Как ограничить общие ресурсы (память) процесса и его детей

Они от sysstat.

sysstat является дополнительным пакетом в "Системной группе" Инструментов. Если это не было выбрано во время установки, пакет не будет установлен.

Для установки sysstat можно выполнить следующее. (если система регистрируется в RHN),

# yum install sysstat
16
13.04.2017, 15:37
3 ответа

Я не уверен, отвечает ли это на ваш вопрос, но я нашел этот скрипт Perl , который утверждает, что делает именно то, что вы ищете. Скрипт реализует свою собственную систему для обеспечения соблюдения ограничений путем пробуждения и проверки использования ресурсов процессом и его дочерними элементами. Кажется, это хорошо задокументировано и объяснено, и недавно было обновлено.

Как сказано в комментарии slm, для этого также можно использовать контрольные группы. Возможно, вам придется установить утилиты для управления контрольными группами, если вы работаете в Linux, вам следует искать libcgroups .

sudo cgcreate -t $USER:$USER -a $USER:$USER -g memory:myGroup

Убедитесь, что $ USER - ваш пользователь.

Затем ваш пользователь должен иметь доступ к настройкам памяти контрольной группы в / sys / fs / cgroup / memory / myGroup .

Затем вы можете установить предел, скажем, 500 МБ, выполнив следующие действия:

echo 500000000 > /sys/fs/cgroup/memory/myGroup/memory.limit_in_bytes

Теперь давайте запустим Vim:

cgexec -g memory:myGroup vim

Теперь процесс vim и все его дочерние элементы должны быть ограничены использованием 500 МБ ОЗУ. Однако , я думаю, это ограничение применяется только к ОЗУ, а не к свопу. Как только процессы достигнут предела, они начнут обмениваться местами. Я не уверен, что вы можете обойти это, я не могу найти способ ограничить использование свопа с помощью cgroups.

8
27.01.2020, 19:49

Я создал сценарий, который делает это, используя CGManager, который используется в Ubuntu. Одним из преимуществ является то, что это не требует корневого доступа. Обратите внимание, что управление Cgroup - это немного дистриба, поэтому я не знаю, работает ли это на дистрибутиве, которые используют Systemd Cgroup Management.

#!/bin/sh

set -eu

if [ "$#" -lt 2 ]
then
    echo Usage: `basename $0` "<limit> <command>..."
    exit 1
fi

limit="$1"
shift
cgname="limitmem_$$"
echo "limiting memory to $limit (cgroup $cgname) for command $@"

cgm create memory "$cgname" >/dev/null
cgm setvalue memory "$cgname" memory.limit_in_bytes "$limit" >/dev/null
# try also limiting swap usage, but this fails if the system has no swap
cgm setvalue memory "$cgname" memsw.limit_in_bytes "$limit" >/dev/null 2>&1 || true

# spawn subshell to run in the cgroup
set +e
(
set -e
cgm movepid memory "$cgname" `sh -c 'echo $PPID'` > /dev/null
exec "$@"
)
# grab exit code
exitcode=`echo $?`

set -e

echo -n "peak memory used: "
cgm getvalue memory "$cgname" memory.max_usage_in_bytes | tail -1 | cut -f2 -d\"

cgm remove memory "$cgname" >/dev/null
exit $exitcode

Использование: Сохранить как limitmem на вашем пути и сделать его исполняемым. Затем запустите E.g. Команда Limitmem 1G ... . Это ограничивает фактически использованную память. Если это достигнуто, убийца OOM убьет процесс или один из его детей, но не что-то случайное, что не имеет ничего общего с этой командой.

2
27.01.2020, 19:49

https://unix.stackexchange.com/a/536046/4319:

В любом дистрибутиве на основе systemd -вы также можете косвенно использовать cgroups через запуск systemd -. Например. для вашего случая ограничения pdftoppmдо 500 МБ ОЗУ используйте:

systemd-run --scope -p MemoryLimit=500M pdftoppm

...

9
27.01.2020, 19:49

Теги

Похожие вопросы