Устройство Linux / Объяснение

Память cgroup v2: current, high, max и события OOM

Сопоставьте расход памяти группы с high и max, проверьте прирост memory.events и отличите ограничение контейнера от запаса RAM всей машины.

Средний8 минОбщие принципы LinuxLinux · понятия и интерфейсыBash · pipeline semantics

На хосте есть RAM, а нагрузка ограничена

Программа внутри контейнера испытывает задержки или завершается, хотя на машине ещё есть доступная память. Для разбора нужен бюджет именно её группы. Общий meminfo и показатели cgroup не следует смешивать в одну цифру свободного запаса.

Начните с принадлежности актуального PID. Затем прочитайте расход, границы и события одним коротким набором. Этот опыт собирает факты для диагностики; он не меняет лимиты и не воспроизводит OOM искусственно.

Расход, торможение и жёсткая граница

memory.current учитывает память группы с потомками. memory.high задаёт границу давления и торможения при возврате памяти, memory.max — жёсткий предел. Само превышение high не вызывает OOM killer. Числовые размеры выражены в байтах, max означает отсутствие границы на этом уровне.

memory.events содержит накопленные события, в том числе high, max, oom и oom_kill; это разные показатели. Учёт по умолчанию иерархический, а для локальных событий существует memory.events.local. Значения следует сопоставлять за один интервал.

Прочитайте проверенный каталог группы

Замените example.slice/worker.scope на реально найденный путь cgroup v2 по предыдущему разбору. Если файл недоступен, пример сообщает об этом вместо подстановки нуля.

Локальная Linux-система
memory_group="/sys/fs/cgroup/example.slice/worker.scope"
for metric in memory.current memory.high memory.max memory.events; do
  printf "%s: " "$metric"
  if [ -r "$memory_group/$metric" ]; then cat "$memory_group/$metric"; else printf "недоступно\n"; fi
done

Отделите старое событие от текущего эпизода

Для собственного примера: current равен 314572800 байтам, high — 268435456, max — 536870912. Это 300, 256 и 512 MiB соответственно. Расход выше high, но ниже max; такой снимок нельзя описать как доказательство уже выполненного OOM-убийства.

Снимите events до и после интересующего эпизода. Старый ненулевой oom_kill не датирует событие временем вашего чтения. Чтобы связать его с приложением, нужны прирост, интервал и журналы. Рост high полезно сопоставить с задержками, сохранив тот же каталог группы.

Проверьте своё рассуждение

Задача: memory.max содержит max. Гарантирует ли это, что группе доступна вся физическая память без иных ограничений?

Нет. Это характеристика данного уровня. Родительский бюджет и доступность памяти системы всё ещё имеют значение; ограниченное представление контейнера может не показывать всю цепочку родителей.

Нельзя суммировать родителя и потомка как независимые расходы

Иерархический учёт уже включает поддерево. При сравнении нескольких снимков не складывайте общий расход группы с тем же расходом её детей. Если интерфейс отсутствует, проверьте контроллер и версию; не заменяйте неполное наблюдение заявлением о нулевом потреблении.

Технические источники

Использованы для проверки поведения. Объяснения и учебные сценарии созданы для проекта.

  • Документация ядра Linux — Control Group v2
  • Linux man-pages — cgroups(7)

Проверка текста: 2026-09-11. Нативное исполнение на всей матрице дистрибутивов ещё не подтверждено.

Только Linux с cgroup v2 и доступным memory-контроллером. Путь группы выбирается по её фактическому монтированию. Пример читает файлы, не записывает лимиты и не создаёт дефицит памяти.

От материала к практике

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

Поиск по Linux

Поиск локальный. ↑ ↓ — перейти к результату, Enter — открыть.

Навигация