Они от sysstat.
sysstat является дополнительным пакетом в "Системной группе" Инструментов. Если это не было выбрано во время установки, пакет не будет установлен.
Для установки sysstat можно выполнить следующее. (если система регистрируется в RHN),
# yum install sysstat
Я не уверен, отвечает ли это на ваш вопрос, но я нашел этот скрипт 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.
Я создал сценарий, который делает это, используя 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 убьет процесс или один из его детей, но не что-то случайное, что не имеет ничего общего с этой командой.
https://unix.stackexchange.com/a/536046/4319:
В любом дистрибутиве на основе systemd -вы также можете косвенно использовать cgroups через запуск systemd -. Например. для вашего случая ограничения pdftoppm
до 500 МБ ОЗУ используйте:
systemd-run --scope -p MemoryLimit=500M pdftoppm
...