Во-первых, большая часть того, что появляется в результатах поиска в Интернете, устарела. Например, cgmanager
больше не поддерживается в новых версиях systemd. Не используйте для этой работы cuplimit
, nice
, cgset
или другие инструменты, не следуйте 99% того, что появляется в веб-поиске. Они либо не будут работать так, как рекламируется (, как в случае инструментов управления cgroup, которые предполагают, что вы создадите свою собственную иерархию ), либо не выполнят свою работу, не прибегая к множеству хаков (, как в случае использования «хороших» уровней для управления целыми группами процессов ).
Хорошей новостью является то, что наряду с этими устаревшими (и следованием традиционному всепожирающему осьминогу-монстру -методу работы systemd )для всего существует конфигурация по умолчанию. в системе, и настроить его для системных служб тривиально.Просто добавьте конфигурацию наложения к службе, которую вы хотите ограничить :
.
$ sudo systemctl edit
Добавьте раздел с любыми значениями управления ресурсами , которые вы хотите переопределить. В моем случае я придумал это:
[Service]
CPUWeight=20
CPUQuota=85%
IOWeight=20
MemorySwapMax=0
Эти значения не все необходимы, но первые два отвечают на поставленный вопрос:
CPUWeight
по умолчанию равно 100 для всех процессов в системе. Установка низкого значения по-прежнему позволяет процессу использовать ЦП, если ничто другое эффективно не поддерживает реакцию системы на другие задачи, не сильно замедляя результаты. Это произвольное целое число веса. CPUQuota
— это абсолютный предел того, сколько процессорного времени предоставляется, даже если больше ничего не происходит. Это процентное значение. В моем случае на самом деле не было необходимости устанавливать это, чтобы решить проблему перегрузки ресурсов. Я все равно установил его, чтобы снизить температуру процессора, когда накапливается много заданий CI. IOWeight
во многом совпадает с CPUWeight
, в данном случае используется для того, чтобы диски были свободны для системных задач и чтобы они были заняты только заданиями CI, когда больше ничего не происходит. MemorySwapMax
также не относится к вопросу, в моем случае я добавил его, потому что лучевой травер (povray
), работающий в некоторых заданиях CI, кажется, использует 30+ гигабайт подкачки в дополнение к 30+ Гиги оперативной памяти в этой системе - хорошая идея только потому, что она есть. Он работает быстрее, если вы вообще не позволяете ему использовать его. Это, вероятно, лучше настроить в povray, но таким образом мне не нужно контролировать то, что происходит внутри заданий CI, и не нужно отключать системный своп. Наконец, эти значения можно изменить «на лету» без перезапуска служб, запустив systemctl daemon-reload
. Это очень удобно, чтобы сразу увидеть эффект от изменений.