Как ограничить использование ЦП и ОЗУ процессом с помощью Cgroups в Ubuntu

В Ubuntu наиболее безопасный общий способ ограничения рабочей нагрузки с помощью cgroups — позволить systemd создать и управлять своей группой управления. Используйте это systemd-runдля команды, которую вы запускаете сейчас, или настройте службу systemd, когда ограничение должно сохраняться после перезапуска. Установите CPUQuota=жесткий потолок процессорного времени и выберите между MemoryHigh=режимом ограничения нагрузки и MemoryMax=жестким ограничением памяти. Эти ограничения применяются к юниту и его дочерним процессам вместе.

cgroup (control group) — это механизм ядра Linux, который организует процессы, позволяя системе учитывать и контролировать использование ими ресурсов. В Ubuntu systemd уже размещает службы в cgroups, поэтому большинству пользователей не нужно создавать каталоги вручную /sys/fs/cgroup. Примеры ниже используют интерфейс управления ресурсами systemd и должны быть проверены на соответствие версии systemd, установленной в вашей версии Ubuntu.

Имитация терминала в стиле Ubuntu, проверяющая версию systemd и тип монтирования cgroup2fs перед установкой ограничений на ресурсы.
Иллюстративный макет терминала для проверки systemd и монтирования cgroup v2. Отображаемая версия и вывод являются примерами, а не результатом теста.

Выберите элемент управления, соответствующий задаче.

МетодЧто оно контролируетНаилучший вариантГлавный компромисс
systemd-runпереходный диапазонОграничения по квоте ЦП и памяти для новой запущенной команды и её потомковСборка, скрипт, импорт или одноразовое пакетное заданиеОбласть действия является временной и заканчивается с завершением рабочей нагрузки; она не привязывается к произвольному процессу, который уже запущен.
настройки службы systemdРесурсы для группы процессов службы (cgroup), включая дочерние процессы.Демон или приложение, которое должно сохранять те же ограничения после перезагрузки.Для применения новых настроек требуется настройка службы и, как правило, перезапуск.
Прямая передача файлов cgroup v2Контроллеры уровня ядра, такие как cpu.maxиmemory.maxСреды выполнения контейнеров, делегированные менеджеры cgroup или специализированное администрированиеБолее трудоемкий процесс; systemd контролирует большую часть иерархии Ubuntu, и запись в его управляемое дерево может конфликтовать с systemd или завершиться неудачей из-за прав доступа и делегирования.
niceилиCPUWeight=Относительный приоритет ЦП при конкуренции между группамиСнижение приоритета фоновых задач при одновременном использовании простаивающего процессора.Это не жесткое ограничение производительности процессора и не ограничивает объем памяти.

Для большинства интерактивных машин Ubuntu временная область действия — это самый быстрый и обратимый вариант. Для производственной среды используйте модуль службы, чтобы политика была задокументирована и восстановлена ​​при загрузке. Используйте файлы cgroup напрямую только в том случае, если вы целенаправленно управляете делегированной иерархией или создаете рабочий процесс для контейнеров/среды выполнения.

Перед установкой ограничений проверьте систему Ubuntu.

Сначала убедитесь, что systemd доступен и что файловая система cgroup имеет унифицированную версию 2:

systemctl --version
stat -fc %T /sys/fs/cgroup

Результат выполнения cgroup2fsвторой команды указывает на унифицированную файловую систему cgroup v2. Версии Ubuntu и пользовательские системы могут отличаться, поэтому не следует предполагать, что на каждой машине одинаковая иерархия или функции systemd. Вы также можете проверить текущую версию systemd с помощью первой команды. Если монтирование cgroup не версии v2, некоторые свойства ресурсов или поведение контроллера могут отличаться; перед копированием конфигурации обратитесь к справочной странице Ubuntu для установленной версии.

Выбирайте значения после измерения рабочей нагрузки. Оставьте запас для остальной части системы и помните, что ограничения, установленные для пользовательской службы, также ограничены любыми ограничениями для ее родительского сегмента. Дочерняя группа cgroup не может получать больше ресурсов, чем разрешает родительская группа.

Ограничьте выполнение команды, которую вы собираетесь запустить.

Для запуска команды в рамках вашей собственной пользовательской сессии используйте команду `.`, которая находится во временной области видимости systemd-run --user --scope. Например:

Макет терминала в стиле Ubuntu, запускающий рабочий процесс Python с 50-процентной квотой ЦП и пороговыми значениями памяти 700 МБ и 900 МБ.
Иллюстративный макет терминала для одноразовой команды systemd-run с указанием квоты ЦП, порога нехватки памяти и жесткого ограничения объема памяти.
systemd-run --user --scope --unit=worker-capped \
  -p CPUQuota=50% \
  -p MemoryHigh=700M \
  -p MemoryMax=900M \
  -- python3 /opt/worker.py

Замените команду Python на программу, которую вам действительно нужно запустить. В этом примере cgroup получает максимальную пропускную способность ЦП, эквивалентную половине одного ЦП, начинает обработку нагрузки на память примерно с 700 МиБ и устанавливает максимальный объем жесткой памяти в 900 МиБ. Значения памяти используют единицы измерения systemd в формате base-1024. Квота 100%представляет собой время, эквивалентное времени одного ЦП; 200%может использовать время, эквивалентное времени двух ЦП, если это возможно. Это не означает процент от всех ядер компьютера.

Эта команда выполняется в фоновом режиме, поскольку это область видимости. После завершения работы временный модуль исчезает. Удаляйте его --userтолько в том случае, если вы собираетесь использовать системный менеджер и имеете необходимые привилегии; для временного модуля, работающего в масштабе всей системы, запустите команду с sudoсоответствующими параметрами. Настройки ресурсов могут быть отклонены, если менеджер или контроллер cgroup их не поддерживают.

Установите ограничения на постоянно используемую службу systemd.

Для такого сервиса, как [название сервиса] worker.service, создайте дополнительный модуль вместо редактирования файла модуля поставщика. Запустите команду sudo systemctl edit worker.serviceи добавьте:

Макет конфигурации службы systemd, содержащий параметры CPUQuota, MemoryHigh и MemoryMax.
Пример конфигурации службы systemd с постоянным контролем использования ЦП и памяти. Используйте реальное имя службы и значения, соответствующие вашей рабочей нагрузке.
[Service]
CPUQuota=50%
MemoryHigh=700M
MemoryMax=900M

Сохраните файл drop-in, затем перезагрузите определения юнитов systemd и перезапустите службу, чтобы процесс запустился в соответствии с измененной политикой:

sudo systemctl daemon-reload
sudo systemctl restart worker.service

Используйте осторожный потолок использования памяти. Если служба не сможет освободить достаточно памяти ниже определенного уровня MemoryMax, ядро ​​может вызвать механизм принудительного завершения процессов при нехватке памяти внутри этой группы служб. Это может привести к завершению одного или нескольких процессов в группе служб и прерыванию работы. Более безопасным подходом часто является установка MemoryHighуровня, при котором освобождение памяти и регулирование являются приемлемыми, а затем установка MemoryMaxболее высокого значения в качестве окончательной границы. Протестируйте систему с реалистичными пиковыми нагрузками, прежде чем устанавливать жесткие ограничения.

Проверьте устройство и понаблюдайте за его работой.

Для проверки состояния осциллографа, использующего временные параметры, проверьте его, используя указанное вами имя устройства:

Макет терминала, демонстрирующий статус systemctl и мониторинг временной рабочей нагрузки с помощью systemd-cgtop.
Иллюстративный вид состояния и монитора cgroup. Приведенные здесь примерные значения загрузки ЦП и использования памяти не являются результатами реального запуска программы.
systemctl --user status worker-capped.scope
systemd-cgtop

Для системной службы --userв команде status этот параметр опускается. В представлении состояния подтверждается существование и активность модуля; systemd-cgtopотображается текущее использование ресурсов группой управления. Для проверки настроенных свойств запросите информацию о модуле напрямую, например:

systemctl --user show worker-capped.scope \
  -p CPUQuotaPerSecUSec -p MemoryHigh -p MemoryMax

Объем памяти, сообщаемый для cgroup, не обязательно совпадает с показателем, установленным для отдельного процесса: он учитывает память, выделенную для группы, и может включать потомков рабочей нагрузки. Мониторинг следует рассматривать как свидетельство того, как эта рабочая нагрузка ведет себя с течением времени, а не как единое число для слепой оптимизации.

А что, если процесс уже запущен?

systemd-runЗапускает новую команду внутри нового юнита; она не берет произвольный существующий PID и не перемещает его в эту область видимости. Если процесс принадлежит службе systemd, примените настройки к этой службе с помощью drop-in или, для временного изменения, используйте sudo systemctl set-property --runtime worker.service CPUQuota=50% MemoryHigh=700M MemoryMax=900M. --runtimeФорма является временной и не заменяет постоянную конфигурацию службы.

Если процесс является обычной программой в вашей рабочей сессии, безопасный и простой способ — обычно остановить его и запустить заново systemd-runв папке `/etc/systemd ...

Как выбрать политику использования процессора и памяти

  • Нужен жесткий лимит загрузки ЦП? Выберите CPUQuota=. Более низкие значения снижают пиковое потребление ЦП, но могут замедлить выполнение и увеличить время ожидания в очереди.
  • Нужен только более низкий приоритет? Рассмотрите CPUWeight=вариант с использованием квоты. Функция Weight распределяет ресурсы ЦП относительно друг друга в условиях конкуренции; она не резервирует фиксированный процент и не препятствует использованию простаивающих ресурсов ЦП.
  • Нужна дополнительная нагрузка на память без немедленного резкого прекращения работы? Установите ее MemoryHigh=в качестве основного порогового значения нагрузки и наблюдайте за задержкой и процессом высвобождения памяти.
  • Необходима окончательная граница локализации? Добавьте её MemoryMax=с достаточным запасом для обычных пиков. Будьте готовы к выходу за пределы допустимого диапазона, когда границу локализации невозможно будет соблюсти.
  • Уже используете контейнер? Отдайте предпочтение поддерживаемым менеджером контейнеров флагам ЦП и памяти, которые настраивают cgroups для этого контейнера и соответствуют его жизненному циклу.

Для каждой рабочей нагрузки не существует единого идеального предела. Пакетная задача на настольном компьютере может допускать низкую квоту и умеренное ограничение объема памяти; службе, чувствительной к задержкам, может потребоваться больший запас ресурсов ЦП и более высокое ограничение, MemoryHighчтобы избежать пауз, связанных с освобождением памяти. Начинайте с консервативных настроек, отслеживайте состояние устройства во время типичной пиковой нагрузки и регулируйте параметры по одному.

Ссылки

Оставить комментарий

Исправлена ​​ошибка, из-за которой tracker-miner-3 сильно нагружал ЦП в Ubuntu GNOME.

Исправлена ​​ошибка, из-за которой tracker-miner-3 сильно нагружал ЦП в Ubuntu GNOME.

Узнайте, почему tracker-miner-fs-3 может потреблять много ресурсов ЦП в Ubuntu GNOME, как проверить состояние индексирования, уменьшить количество доступных для поиска местоположений и безопасно перестроить индекс Tracker.

Как установить Ubuntu 24.04 и Windows 11 в режиме двойной загрузки с включенным BitLocker

Как установить Ubuntu 24.04 и Windows 11 в режиме двойной загрузки с включенным BitLocker

Узнайте, когда Ubuntu 24.04 может работать в режиме двойной загрузки с включенным BitLocker, как защитить ключ восстановления и какие безопасные пути установки — на один или несколько дисков.

Как подключить клиент Pardus Linux к домену Active Directory

Как подключить клиент Pardus Linux к домену Active Directory

Подключите Pardus Linux к Active Directory с помощью Pardus Domain Joiner. Проверьте DNS и время, установите CLI, подключитесь с помощью SSSD и подтвердите доступ к домену.

Как настроить Pardus Image Creator для развертывания пользовательской операционной системы

Как настроить Pardus Image Creator для развертывания пользовательской операционной системы

Узнайте, на что способен Pardus Image Writer, как его установить и как безопасно записать проверенный пользовательский ISO-образ на USB-накопитель. Включает инструкции по сборке и тестированию.

Исправлена ​​ошибка «Не удалось запустить загрузку модулей ядра» при загрузке SLES.

Исправлена ​​ошибка «Не удалось запустить загрузку модулей ядра» при загрузке SLES.

Диагностика и устранение сбоев systemd-modules-load.service на SLES путем поиска неисправного модуля, корректировки конфигурации загрузки и пересборки initramfs только при необходимости.

Как перенести рабочий стол Debian на неизменяемую ОС с помощью OSTree

Как перенести рабочий стол Debian на неизменяемую ОС с помощью OSTree

Узнайте, почему Debian нельзя сделать неизменяемым с помощью OSTree, установив всего один пакет, а затем безопасно перейдите на рабочий стол OSTree или спланируйте создание собственного образа Debian.

Исправлена ​​ошибка, из-за которой жесты тачпада не работали в Wayland в Ubuntu 24.04.

Исправлена ​​ошибка, из-за которой жесты тачпада не работали в Wayland в Ubuntu 24.04.

Устраните проблему с отсутствием жестов тремя пальцами на тачпаде в Ubuntu 24.04 Wayland, проверив настройки GNOME, события libinput, обновления и расширения.

How to Configure a PipeWire Audio Output Switching Script on Debian

How to Configure a PipeWire Audio Output Switching Script on Debian

Create a reliable PipeWire output toggle script on Debian with wpctl. Switch between speakers, Bluetooth, USB, or HDMI sinks without hard-coding IDs.

Как настроить принтеры через CUPS в операционной системе HamoniKR

Как настроить принтеры через CUPS в операционной системе HamoniKR

Настройте USB- и сетевые принтеры в HamoniKR OS с помощью CUPS. Добавьте очередь печати, выберите IPP без драйверов или драйвер модели, установите параметры по умолчанию и распечатайте тестовую страницу.

Как ограничить использование ЦП и ОЗУ процессом с помощью Cgroups в Ubuntu

Как ограничить использование ЦП и ОЗУ процессом с помощью Cgroups в Ubuntu

Используйте systemd cgroups в Ubuntu для ограничения времени работы процессора и памяти для команды или службы. Сравните временные ограничения, постоянные лимиты и ключевые компромиссы.