Шпаргалка
Следующие действия надо выполнять из под пользователя
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