Linux Labs

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

dmesg и журнал ядра

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

Шаг 6 из 8 · теория · 5 мин

Журнал ядра в journald

Буфер живёт до выключения машины. Чтобы строки ядра пережили перезагрузку, их забирает journald.

journald читает тот же буфер и хранит строки ядра в журнале вместе с остальными. sudo journalctl -k показывает только их за текущую загрузку, -b -1 — за прошлую, если журнал её хранит (у машины урока загрузка одна, и journalctl напечатает No journal boot entry found). Ключ -p err отбирает строки уровня err и важнее. student не входит в группы adm и systemd-journal, поэтому журнал системы читает через sudo.

Там же лежит полный отчёт OOM killer — в уроке о памяти ты находил его по одной строке. Сначала — кто попросил память, когда её не осталось, в конце — кого убили:

python3 invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, …
Memory cgroup stats for /system.slice/lab-hog.service:
…
Tasks state (memory values in pages):
[  pid  ]   uid  tgid total_vm      rss … oom_score_adj name
[   1088]     0  1088    25061     9760 …             0 python3
oom-kill:constraint=CONSTRAINT_MEMCG,…,task=python3,pid=1088,uid=0
Memory cgroup out of memory: Killed process 1088 (python3)
  total-vm:100244kB, anon-rss:32512kB, … oom_score_adj:0

Tasks state — процессы группы с их памятью и поправкой oom_score_adj: ею процесс защищают от OOM killer или, наоборот, подставляют. CONSTRAINT_MEMCG и слова Memory cgroup значат, что кончился лимит группы; при нехватке памяти на всей машине итог начинается с Out of memory:.

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

Начало и конец отчёта OOM в sudo journalctl -k. Что произошло?

nginx invoked oom-killer: gfp_mask=0xcc0(GFP_KERNEL), order=0, oom_score_adj=0
…
Memory cgroup out of memory: Killed process 2210 (java) total-vm:912344kB, anon-rss:401220kB, file-rss:6528kB, shmem-rss:0kB, UID:1001 pgtables:1120kB oom_score_adj:0
  • Убивает ядро. invoked oom-killer называет процесс, чей запрос памяти застал нехватку, а жертву ядро выбирает само.

  • Строка Killed process одна, и в ней java. nginx назван только как процесс, который попросил память.

Первая строка называет процесс, на чьём запросе кончилась память, последняя — кого ядро убило. Жертву ядро выбирает по занятой памяти с поправкой oom_score_adj (здесь java с 400 МБ anon-rss), а не по тому, кто попросил последним.

Главное в шаге

  • sudo journalctl -k — строки ядра из журнала: они переживают перезагрузку, -b -1 — прошлая загрузка.
  • -p err в journalctl и -l в dmesg отбирают строки по важности.
  • Отчёт OOM начинается строкой invoked oom-killer и кончается Killed process; между ними — процессы группы и их память.
Ubuntu 24.04
Загрузка…