Используйте xargs
вместо подкоманды $ (jobs -p)
, потому что, если jobs -p
пусто, команда kill завершится ошибкой.
jobs -p | xargs kill
На ваши вопросы:
Почему: вы, вероятно, используете ядро 4.4.0-59. В таком случае вы столкнулись с ошибкой OOM: https://bugs.launchpad.net/ubuntu/+source/linux/+bug/1655842 .
Как это исправить, если это снова повторится: понизьте версию ядра до, например. 4.4.0-57.
Причиной того, что ваша система завершает процесс, является фрагментация памяти. Однако у вас не было 14 ГБ свободной оперативной памяти, а было около 70 МБ, когда это произошло.
Интересные строки в логе следующие:
[ 2687.946164] Xorg invoked oom-killer: gfp_mask=0x24040c0, order=3, oom_score_adj=0
[ 2687.946424] Node 0 Normal: 10812*4kB (ME) 2620*8kB (UM) 72*16kB (M) 0*32kB 0*64kB 0*128kB 0*256kB 0*512kB 0*1024kB 0*2048kB 1*4096kB (H) = 69456kB
Первая строка с order=3
говорит о том, что размер этого выделения составляет 32 КБ (значение вычисляется page_size * 2^order
или 4096*2*2*2 = 32768
байт.
Вторая строка говорит о том, что в системе было 0 свободных страниц такого размера. Самые большие фрагменты памяти, которые были свободны, составляли блоки размером 16 КБ, а у вас было только 72 из них.
Значение gfp_mask
должно быть декодировано с использованием значений вhttps://github.com/torvalds/linux/blob/master/include/linux/gfp.h
Однако, насколько я понимаю, поскольку этот запрос имел ___GFP_RETRY_MAYFAIL
установку, ядро должно было попытаться восстановить или сжать память и повторить попытку вместо запуска OOM Killer. Это может быть ошибка ядра в версии ядра, которая использовалась, когда это произошло. Или ваша версия ядра была скомпилирована с отключенным сжатием памяти.
Создание задания cron, которое периодически запускает echo 1 > /proc/sys/vm/compact_memory
как root
в качестве обходного пути, может помочь избежать этой проблемы, если ваше ядро не может автоматически сжимать память. Однако это приведет к некоторой дополнительной нагрузке на ЦП, поэтому его не следует запускать, если вместо этого вы обновите ядро.