Gentoo. emerge. Ограничение ресурсов

2026-05-24 · 3 мин. для прочтения
blog

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

  1. Создаем cgroup

    • Создадим отдельную директорию для группы, которой будем управлять:
    sudo mkdir -p /sys/fs/cgroup/emerge
    
    • Проверим, какие ресурсы доступны для управления:
    cat /sys/fs/cgroup/cgroup.controllers
    
  1. Настройка лимитов

    • Зададим конкретные ограничения для этой группы.

    • Ограничение памяти (Memory).

      • Установим лимит на использование оперативной памяти в 4 гигабайта и включим групповой OOM-киллер (который при нехватке памяти завершит всю группу процессов, а не по одному):
        echo "4G" | sudo tee /sys/fs/cgroup/emerge/memory.max
        echo 1 | sudo tee /sys/fs/cgroup/emerge/memory.oom.group
        
    • Ограничение 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
        
  1. Интегрируем с portage

    • Нужно, чтобы все процессы, запускаемые командой emerge, попадали в нашу новую группу.
    1. Утилита cgexec

      • Установите пакет dev-libs/libcgroup и затем запускайте emerge с помощью cgexec:

        cgexec -g cpu,memory,io:emerge emerge <package>
        
      • Здесь явно указаны ресурсы cpu, memory, io и группа emerge.

    1. Скрипт

      • Если 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}"
    
Дмитрий Сергеевич Кулябов
Authors
Профессор кафедры теории вероятностей и кибербезопасности
Работаю профессором на кафедре теории вероятностей и кибербезопасности Российского университета дружбы народов им. Патриса Лумумбы. Научные интересы относятся к области теоретической физики и математического моделирования.