Буфер живёт до выключения машины. Чтобы строки ядра пережили перезагрузку, их забирает journald.
journald читает тот же буфер и хранит строки ядра в журнале вместе с остальными. sudo journalctl -k показывает только их за текущую загрузку, -b -1 — за прошлую, если журнал её хранит (у машины урока загрузка одна, и journalctl напечатает No journal boot entry found). Ключ -p err отбирает строки уровня err и важнее. student не входит в группы adm и systemd-journal, поэтому журнал системы читает через sudo.
Там же лежит полный отчёт OOM killer — в уроке о памяти ты находил его по одной строке. Сначала — кто попросил память, когда её не осталось, в конце — кого убили:
Tasks state — процессы группы с их памятью и поправкой oom_score_adj: ею процесс защищают от OOM killer или, наоборот, подставляют. CONSTRAINT_MEMCG и слова Memory cgroup значат, что кончился лимит группы; при нехватке памяти на всей машине итог начинается с Out of memory:.
Начало и конец отчёта 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; между ними — процессы группы и их память.