Gentoo. emerge. Ограничение ресурсов
Gentoo. emerge. Ограничение ресурсов.
Содержание
1 Общая информация
- Стоит задача ограничения использования ресурсов системы при компиляции пакетов.
2 Cgroup
- Используем либо возможности systemd, либо настраиваем сами.
2.1 systemd
- Используем
systemd-run(см. Параметры systemd-run). systemdсам позаботится о создании нужной cgroup и применении всех заданных в файле лимитов.- Создайте файл, например,
/etc/systemd/system/emerge.slice:sudo touch /etc/systemd/system/emerge.slice - Заполните его:
[Slice]
MemoryMax=4G
CPUQuota=50%
CPUWeight=idle
IOWeight=50
- Запустите команду от имени этого slice:
sudo systemd-run --slice=emerge.slice --scope emerge <package>
2.2 Ручная настройка
2.2.1 Проверка cgroups
- Убедимся, что система использует cgroups второй версии (v2).
- Проверим, что файловая система
cgroup2смонтирована:
mount -l | grep cgroup2
- Ожидаемый вывод:
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
2.2.2 Настройка для portage
Создаем cgroup
- Создадим отдельную директорию для группы, которой будем управлять:
sudo mkdir -p /sys/fs/cgroup/emerge- Проверим, какие ресурсы доступны для управления:
cat /sys/fs/cgroup/cgroup.controllers
Настройка лимитов
Зададим конкретные ограничения для этой группы.
Ограничение памяти (Memory).
- Установим лимит на использование оперативной памяти в 4 гигабайта и включим групповой OOM-киллер (который при нехватке памяти завершит всю группу процессов, а не по одному):
echo "4G" | sudo tee /sys/fs/cgroup/emerge/memory.max echo 1 | sudo tee /sys/fs/cgroup/emerge/memory.oom.group
- Установим лимит на использование оперативной памяти в 4 гигабайта и включим групповой OOM-киллер (который при нехватке памяти завершит всю группу процессов, а не по одному):
Ограничение CPU.
- Ограничение процессора задается через веса. Например, вес
100означает, что группаemergeбудет получать примерно в два раза меньше процессорного времени, чем группа с весом200(стандартный вес по умолчанию — 100).echo "50" | sudo tee /sys/fs/cgroup/emerge/cpu.weight
- Ограничение процессора задается через веса. Например, вес
Ограничение дискового I/O.
Ограничение операций ввода-вывода настраивается чуть сложнее. Сначала нужно узнать номера ваших дисков (
major:minor):lsblk -o NAME,MAJ:MINПредположим, мы хотим ограничить пропускную способность для диска с номерами
8:0(обычно это/dev/sda) до 10 мегабайт в секунду.Мы записываем лимит в формате
Номер_устройства:номер_узла Тип_операции=Лимит.Число
$((10 * 1024 * 1024))— это 10 МиБ/с:echo "8:0 wbps=$((10 * 1024 * 1024))" | sudo tee /sys/fs/cgroup/emerge/io.max echo "8:0 rbps=$((10 * 1024 * 1024))" | sudo tee /sys/fs/cgroup/emerge/io.max
Интегрируем с portage
- Нужно, чтобы все процессы, запускаемые командой
emerge, попадали в нашу новую группу.
Утилита
cgexecУстановите пакет
dev-libs/libcgroupи затем запускайтеemergeс помощьюcgexec:cgexec -g cpu,memory,io:emerge emerge <package>Здесь явно указаны ресурсы
cpu,memory,ioи группаemerge.
Скрипт
Если
cgexecпо каким-то причинам недоступен, подойдет shell-скрипт.Создайте файл
~/bin/emerge-cgсо следующим содержимым:#!/bin/bash # Путь к cgroup CGROUP_PATH="/sys/fs/cgroup/emerge" # Проверяем, существует ли группа if [ ! -d "$CGROUP_PATH" ]; then echo "Ошибка: Cgroup $CGROUP_PATH не найдена. Создайте ее: sudo mkdir -p $CGROUP_PATH" exit 1 fi # Добавляем текущий PID и все будущие дочерние процессы в группу emerge echo $$ | sudo tee "$CGROUP_PATH/cgroup.procs" > /dev/null # Запускаем оригинальную команду emerge со всеми переданными аргументами exec emerge "$@"Сделайте скрипт исполняемым:
chmod +x ~/bin/emerge-cg.Теперь команда
emerge-cg <package>запустит сборку с лимитами.
- Нужно, чтобы все процессы, запускаемые командой
3 Параметры portage
3.1 Ограничение использования CPU
Ограничение числа потоков (
MAKEOPTS)- Переменная напрямую влияет на загрузку процессора и потребление памяти.
- Рекомендуется указывать значение на 1-2 меньше числа логических ядер, чтобы система оставалась отзывчивой.
# /etc/portage/make.conf MAKEOPTS="-j4" # для 4-поточного CPU
Понижение приоритета планировщика (
PORTAGE_SCHEDULING_POLICY).- Политика
idleдает компиляции наименьший приоритет, используя ресурсы ЦП только в моменты полного простоя, и является более эффективным методом, чемPORTAGE_NICENESS.# /etc/portage/make.conf PORTAGE_SCHEDULING_POLICY="idle"
- Политика
3.2 Контроль использования памяти
Индивидуальная настройка для «прожорливых» пакетов.
- Для управления пакетами, потребляющими много памяти при компиляции (например,
qtwebengine,firefox), можно создать файл/etc/portage/package.envс ограничением потоков только для них:# /etc/portage/package.env dev-qt/qtwebengine lowmemory.conf www-client/firefox lowmemory.conf
- Для управления пакетами, потребляющими много памяти при компиляции (например,
В файле
/etc/portage/env/lowmemory.confпрописать:MAKEOPTS="-j1"
3.3 Снижение нагрузки на диск
- Понижение приоритета ввода-вывода.
- Эта настройка дает процессам компиляции (
emerge) наименьший приоритет доступа к диску, что помогает сохранить отзывчивость системы.# /etc/portage/make.conf PORTAGE_IONICE_COMMAND="ionice -c 3 -p \${PID}"
