Как работает CPUQuota в systemd

Вопрос или проблема

Я настраиваю файл .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 и следить за метриками производительности для оптимизации нагрузки на систему.

Оцените материал
Добавить комментарий

Капча загружается...