Вопрос или проблема
Я настраиваю файл .slice
для systemd. Я хочу ограничить срез до определенного количества времени процессора. Но из документации systemd не совсем ясно, интерпретируется ли процент, указанный для CPUQuota
, как количество ядер или как доля от всей системы.
Если говорить конкретно: у моего компьютера 36 ядер. Если я хочу ограничить срез до 9 из них (1/4 от общей мощности системы), мне нужно указать CPUQuota:25%
или CPUQuota:900%
?
CPUQuota=900%
согласно мануалу systemd.resource-control
Квоты не масштабируются в зависимости от количества процессоров в системе, аналогично тому, как работают единицы ресурсов CPU в Kubernetes. Легкая оболочка для функций ядра: cgroups и планировщик CPU.
Когда количество системных процессоров неизвестно, например, в обобщенно упакованном модуле, рассмотрите возможность не указания квоты. Планировщик CPU сделает все возможное, чтобы справедливо распределить циклы. Сложно так сильно истощить систему, чтобы она полностью не реагировала.
Таким образом, с бюджетом на 9 CPU, если какая-то ресурсозатратная компиляция сможет поддерживать, скажем, 12 параллельных потоков, это, вероятно, нормально. Временные интервалы CPU работают по очереди, и этот модуль может использовать больше общего количества CPU на какое-то время. Конечно, следите за его производительностью для планирования емкости. Особенно полезно наблюдать за cpu.pressure
для каждой cgroup, которая на самом деле фиксирует конкуренцию, а не только использование.
Если одному срезу (или другому типу модуля) необходимо предоставить большую долю ресурсов CPU независимо от количества процессоров, рассмотрите возможность использования CPUWeight=
в systemd. Например, удвоив его до 200. Даже с настройками по умолчанию, просто наличие срезов, отличных от system.slice
и user.slice
, заставит их по очереди ожидать, когда они оба готовы к выполнению. Это может быть полезно, хотя у меня нет практического примера, когда это было бы необходимо в отличие от всего в пользовательском или системном пространстве.
Для полноты возможно внедрить долю общей квоты CPU во время выполнения с помощью очень умной системы конфигурации systemd. Напишите скрипт генератора systemd, который определяет количество процессоров, умножает его на желаемый процент и записывает конфигурацию CPUQuota в /run/systemd/generator/example.slice.d/cpu.conf
или как бы вы ни назвали свой срез. Это сложнее, чем кажется, так как генераторы запускаются очень рано. Возможно, программа nproc --all
работает, но я не тестировал. Я указал это в последнюю очередь, так как считаю жесткие квоты менее приоритетными по сравнению с оценкой пользовательского опыта и счетчиками давления CPU.
Ответ или решение
Как работает CPUQuota в systemd
В рамках системы управления ресурсами, предлагаемой systemd
, параметр CPUQuota
играет ключевую роль в ограничении использования процессорного времени для различных единиц (unit), таких как службы, пользовательские срезы и другие компоненты. Если вы хотите ограничить использование CPU для определённого среза (.slice
), важно понимать, как именно трактуется заданное значение CPUQuota
.
Интерпретация значения CPUQuota
По данным официальной документации systemd, значение параметра CPUQuota
задается в процентах от общего доступного времени CPU и не зависит от числа ядер процессора на вашей системе. Это означает, что если у вас на машине 36 ядер и вы хотите ограничить использование CPU до 9 ядер, вам нужно установить CPUQuota
равным 900% (то есть 9 из 36 ядер).
Правильная настройка
В вашем конкретном случае, если вы хотите задать лимит в 1/4 от общей вычислительной мощности, вам следует указать:
CPUQuota=900%
Тем не менее, использование такого рода ограничения может привести к непредсказуемым эффектам, особенно если ваша служба или процесс могут запускать несколько потоков. Например, программа, способная поддерживать 12 параллельных потоков, всё равно сможет эффективно использовать выделенные ей ресурсы в рамках установленных лимитов.
Учет в системе
systemd
использует механизмы управления группами процессов (cgroups) и планировщик CPU для распределения ресурсов. Важно помнить, что установка низкого значения CPUQuota
не обязательно приведет к тому, что система станем неотзывчивой; планировщик будет стараться сбалансировать ресурсы и выделять время на работающие процессы.
Для мониторинга использования ресурсов в cgroups полезно следить за метриками, такими как cpu.pressure
, которые отслеживают контенцию ресурсов, а не просто их использование. Это может быть полезно для долгосрочного планирования емкости и принятия решений.
Альтернативные варианты
Если вам нужно назначить более высокий приоритет для одной из единиц, помимо CPUQuota
, вы можете рассмотреть использование параметра CPUWeight
. Это значение позволяет задавать относительный приоритет в распределении процессорного времени между разными срезами или службами:
CPUWeight=200
Это может обеспечить более высокое использование CPU для выбранных задач, особенно если они требуют большой вычислительной мощности.
Умное автоматизированное управление
Вы также можете рассмотреть возможность создания генератора systemd
, который будет автоматически рассчитывать необходимое значение CPUQuota
в зависимости от количества доступных ядер. Например, такой скрипт может умножать общее количество ядер на желаемый процент и записывать значения в конфигурацию вашего среза. Однако, поскольку генераторы активируются на ранних этапах загрузки системы, данный подход требует тщательной проработки.
Заключение
Установка параметра CPUQuota
в systemd
является мощным инструментом для управления производительностью и распределения вычислительных ресурсов. Убедитесь, что вы понимаете механизмы, стоящие за этим параметром, и адаптируйте ваши настройки в зависимости от конкретных нужд вашего приложения и системы в целом.
Для более углубленного изучения рекомендую ознакомиться с документацией systemd и следить за метриками производительности для оптимизации нагрузки на систему.