Как ограничить использование ЦП и ОЗУ процессом с помощью 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чтобы избежать пауз, связанных с освобождением памяти. Начинайте с консервативных настроек, отслеживайте состояние устройства во время типичной пиковой нагрузки и регулируйте параметры по одному.

Ссылки

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

Как безопасно восстановить потерянные разделы и данные с жесткого диска

Как безопасно восстановить потерянные разделы и данные с жесткого диска

Узнайте, как восстановить потерянные разделы и файлы с помощью TestDisk и PhotoRec. Защитите исходный диск, проведите безопасное сканирование и сохраните восстановленные данные на другой диск.

Как сканировать QR-коды на настольном компьютере с Linux

Как сканировать QR-коды на настольном компьютере с Linux

Сканируйте QR-коды в Linux с помощью CoBang, используя веб-камеру или файл изображения. См. варианты установки, шаги настройки и решения проблем с доступом к камере Flatpak.

Как изменить настройки веб-камеры в Linux с помощью Cameractrls

Как изменить настройки веб-камеры в Linux с помощью Cameractrls

Изменяйте настройки веб-камеры в Linux с помощью Cameractrls: настраивайте экспозицию, цвет, подавление мерцания и другие поддерживаемые параметры, а затем проверяйте совместимые видеорежимы.

Как установить PhpStorm на Linux: Toolbox, Tar.gz, Snap и AUR

Как установить PhpStorm на Linux: Toolbox, Tar.gz, Snap и AUR

Установите PhpStorm на Linux с помощью JetBrains Toolbox или автономного архива tar.gz, а также через Snap и Arch AUR. Java уже включена в комплект.

Как создать резервную копию CD-ROM в формате ISO в Linux

Как создать резервную копию CD-ROM в формате ISO в Linux

Создайте образ CD-ROM ISO в Linux с помощью GNOME Disks или dd. Определите оптический привод, отслеживайте процесс копирования, проверяйте образ и узнавайте, когда поврежденный диск или аудиодиск требует использования другого инструмента.

Как вырезать изображение в Linux с помощью GIMP

Как вырезать изображение в Linux с помощью GIMP

Удаление фона фотографии в Linux с помощью GIMP: обведите контур объекта, удалите выделенный фон, сохранив прозрачность, и экспортируйте многоразовый PNG-файл.

Как установить Cisco Packet Tracer на Linux

Как установить Cisco Packet Tracer на Linux

Загрузите Cisco Packet Tracer 9.0.1 для Ubuntu 64-бит, установите DEB-пакет с помощью APT, примите лицензионное соглашение в Терминале и войдите в систему, чтобы начать лабораторную работу.

Скачайте FlightGear бесплатно: официальное руководство по установке

Скачайте FlightGear бесплатно: официальное руководство по установке

Скачайте FlightGear бесплатно с официального сайта. Сравните пакеты для Windows, macOS и Linux, установите файлы данных и совершите свой первый полет.

Настольное приложение Google Tasks: как им пользоваться на компьютере

Настольное приложение Google Tasks: как им пользоваться на компьютере

Откройте Google Задачи в браузере, добавьте ярлык Chrome или запустите приложение, и управляйте задачами с указанием даты через Календарь и Gmail.

OKSampler: Бесплатный и простой музыкальный сэмплер для клавишных ритмов.

OKSampler: Бесплатный и простой музыкальный сэмплер для клавишных ритмов.

OKSampler сопоставляет MP3-клипы с клавишами клавиатуры и может зацикливать аудио. Узнайте, что делает эта старая бесплатная программа, на чем заканчиваются ее старые функции и что нужно проверить перед загрузкой.