Linux Labs

Система изнутри: ресурсы, ядро, процессы / Ступень 2 из 12

Память, swap и OOM killer

Не запущена Запускается обычно ~20 с
Выйти из урока

Шаг 4 из 9 · на машине · 7 мин

Потолок службы

Вернись к службе превью: у машины доступно около 300 МиБ, а процесс службы убит за нехватку памяти. Посмотри, сколько памяти отведено самой службе.

Упражнение · посмотреть

Найди потолок и строку ядра

Посмотри потолок памяти службы lab-thumbs и число её перезапусков, потом — строки журнала ядра о нехватке памяти.

Сначала предположи

В юните lab-thumbs стоит MemoryMax=64M. Что systemctl show напечатает в MemoryMax?

Теперь начни упражнение, выполни команду и сверь прогноз с выводом.

Войти и начать Машина доступна после входа

У каждой службы systemd своя cgroup — группа процессов, которой ядро считает и ограничивает ресурсы. Строка MemoryMax=64M в юните lab-thumbs — потолок памяти этой группы: в счёт идут все процессы службы и их кэш файлов.

Превью панорамы — файл на 48 МиБ и его копия в памяти. Когда группа упирается в потолок, ядро сначала выбрасывает её кэш, а потом зовёт OOM killer внутри группы. Тот выбирает самый большой процесс и завершает его сигналом SIGKILL. Перехватить этот сигнал нельзя, поэтому thumbs не успел ничего написать в свой журнал.

Каждое такое убийство ядро записывает в свой журнал. Memory cgroup out of memory в начале строки значит, что кончилась память группы. При нехватке на всей машине строка начинается с Out of memory:. anon-rss — память самого процесса: около 64 МиБ, впритык к потолку.

systemd видит, что процесс убит за память, и пишет у службы Result=oom-kill. Restart=on-failure велит запустить службу снова, NRestarts растёт, служба снова берётся за панораму — и снова упирается в потолок.

Проверь себя 1 вопрос

В journalctl -k строка: Memory cgroup out of memory: Killed process 2210 (java) … anon-rss:524288kB. Что она говорит?

  • При нехватке на всей машине строка начинается с Out of memory:. Memory cgroup — нехватка внутри группы.

  • Killed process — процесс завершило ядро сигналом SIGKILL. Своей ошибки java напечатать не успел.

Memory cgroup out of memory — кончилась память группы процессов, а Killed process — ядро завершило процесс сигналом SIGKILL. 524288 kB — это 512 МиБ: столько процесс занимал в момент убийства.

Ubuntu 24.04
Загрузка…