Вернись к службе превью: у машины доступно около 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 растёт, служба снова берётся за панораму — и снова упирается в потолок.
В 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 МиБ: столько процесс занимал в момент убийства.