пятница, 24 января 2020 г.

Проблемы с OOM Killer-ом

Шпаргалка

Следующие действия надо выполнять из под пользователя root.

Что бы примелось "сейчас" без перезагрузки:

echo 2 > /proc/sys/vm/overcommit_memory
echo 80 > /proc/sys/vm/overcommit_ratio

Что бы сохранилось после перезагрузки нужно в файл /etc/sysctl.conf дописать (если их там нет) следующие строчки

vm.overcommit_memory = 2
vm.overcommit_ratio = 80
 

Суть проблемы

По умолчанию в Linux ядро всегда "удовлетворяет" запрос на выделение памяти, даже если этой памяти нет. Суть стратегии в том, что программы не всегда используют всю запрашиваемую память, или используют её не сразу, и к тому моменту когда она будет нужна программе, она скорее всего будет доступна. Можно корректировать это поведение через vm.overcommit_memory. Значение 2 для этого аргумента говорит, что если нет "доступной виртуальной" памяти, то вызов malloc() (запрос на выделение памяти в приложении) должен возвращать NULL (честно говорит программе, что памяти которую ей надо в доступе нет.

Второй параметр vm.overcommit_ration определяет, какой процент физической памяти (RAM) + плюс добавленный к ней swap рассматривать, для определения доступного для выделения пространства. Т.е. мы указали, что можно выделять память в 80% процентах RAM + swap. Т.е. на машине с 4GB RAM и 1GB swap для приложений доступно 4.2 ГБ (3.2GB от RAM и 1GB от swap). Если в пределах этого размера нет непрерывного (!!!) свободного пространства, то будет вернут NULL.

Источники:

  • https://www.kernel.org/doc/Documentation/sysctl/vm.txt
  • https://www.win.tue.nl/~aeb/linux/lk/lk-9.html#ss9.6
  • http://bl0rg.krunch.be/oom-frag.html 
  • https://utcc.utoronto.ca/~cks/space/blog/linux/DecodingPageAllocFailures