systemd
может ограничивать ресурсы цели/службы. На странице man
:
CPUQuota
:
Назначьте указанную квоту процессорного времени исполняемым процессам. Принимает процентное значение с суффиксом "%". Процент определяет максимальное количество процессорного времени, которое модуль должен получить по отношению к общему процессорному времени, доступному на одном процессоре. Используйте значения > 100 % для выделения процессорного времени более чем одному процессору. Это управляет атрибутом «
cpu.max
» в иерархии единой группы управления и атрибутом «cpu.cfs_quota_us
» в устаревшей версии. Подробнее об этих атрибутах контрольной группы см. вcgroup-v2.txt
иsched-design-CFS.txt
.Пример:
CPUQuota=20%
гарантирует, что исполняемые процессы никогда не получат более 20% процессорного времени на одном ЦП.Подразумевается «
CPUAccounting=true
».
Поскольку использование этого подразумевает CPUAccounting
, я также включу это
Включите учет использования ЦП для этого устройства. Принимает логический аргумент. Обратите внимание, что включение учета ЦП для одного модуля также неявно включит его для всех модулей, содержащихся в одном и том же слайсе, а также для всех его родительских слайсов и содержащихся в них модулей. Системное значение по умолчанию для этого параметра можно контролировать с помощью
DefaultCPUAccounting=
вsystemd-system.конф(5)
.
Я также приведу цитату из Slice
:
Имя единицы среза, в которую помещается единица. По умолчанию
system.slice
для всех не созданных единиц все типы юнитов (кроме самих юнитов-срезов, см. ниже). Экземпляры по умолчанию помещаются в подслайсsystem.slice
, названный в честь имени шаблона.
Таким образом, по умолчанию все будет помещено в один и тот же срез
, что означает, что все находится в одном пуле ресурсов.
Также можно посмотреть MemoryHigh
:
Укажите верхний предел использования памяти выполняемыми процессами в этом блоке. Использование памяти может превысить предел, если это неизбежно, но процессы сильно замедляются, и в таких случаях память агрессивно отбирается. Это основной механизм управления использованием памяти юнитом.
Принимает размер памяти в байтах. Если значение имеет суффикс K, M, G или T, указанный размер памяти анализируется как килобайты, мегабайты, гигабайты или терабайты (с основанием 1024) соответственно. В качестве альтернативы можно указать процентное значение, которое берется относительно установленной физической памяти в системе. Если присвоено специальное значение «бесконечность», ограничение памяти не применяется. Это управляет атрибутом группы управления "
memory.high
". Подробнее об этом атрибуте контрольной группы см. вcgroup-v2.txt
.Подразумевается «
MemoryAccounting=true
».Этот параметр поддерживается, только если используется единая иерархия групп управления и отключает
MemoryLimit=
.
Вы можете легко добавить скрипт в службу systemd
.
Предположим, что /usr/local/thatscript.sh
— это скрипт:
/usr/lib/systemd/system/thatscript.service
[Unit]
Description=This runs "thatscript"
ConditionFileNotEmpty=/usr/local/thatscript.sh
[Service]
Type=simple
ExecStart=/usr/local/thatscript.sh
CPUQuota=20%
[Install]
WantedBy=multi-user.target
Тогда вам понадобится демон systemctl -reload
, чтобы прочитать новый файл службы, затем вы можете systemctl включить thatscript.service
, если вы хотите, чтобы он запускался при загрузке, или systemctl запустить thatscript.service
, если вы хотите запустить его вручную.