Память cgroup v2: current, high, max и события OOM
Сопоставьте расход памяти группы с high и max, проверьте прирост memory.events и отличите ограничение контейнера от запаса RAM всей машины.
На хосте есть 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 по предыдущему разбору. Если файл недоступен, пример сообщает об этом вместо подстановки нуля.
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 или проверьте знакомые команды в учебном терминале.