Что такое sysctl vm.min_free_kbytes, настраиваемый для ядра Linux, и какое значение должно быть установлено? В этой статье мы изучим этот параметр и его влияние на работающую систему Linux.
Когда ядро сыпет ошибками в лог page allocation failure скорей всего мы столкнулись с вот этим багом https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=901420
Настраиваемый модуль ядра Linux vm.min_free_kbytes может быть изменен и может резервировать память в системе, чтобы обеспечить более стабильную работу системы, особенно во время интенсивного использования и интенсивного выделения памяти. Параметры по умолчанию могут быть слишком низкими, особенно в системах с большим объемом памяти, и их следует увеличивать.
Как работает vm.min_free_kbytes
Выделение памяти может потребоваться системе для обеспечения правильного функционирования самой системы. Если ядро позволяет выделять всю память, ему может быть сложно получить память для регулярных операций, чтобы обеспечить бесперебойную работу ОС. В частности такими являются сетевые операции, под которые не может использоваться swap. Вот почему ядро предоставляет настраиваемый vm.min_free_kbytes.
Настраиваемый параметр заставит диспетчер памяти ядра сохранить не менее X объема свободной памяти. Вот официальное определение из документации ядра Linux: «Это используется для того, чтобы Linux оставила свободным минимум килобайт. Ядро использует это число для вычисления значения watermark[WMARK_MIN] для каждой зоны lowmem в системе. Каждая зона lowmem получает количество зарезервированной свободной памяти пропорционально ее размеру. Некоторый минимальный объем памяти необходим для выполнения распределений PF_MEMALLOC; если вы установите значение ниже 1024 КБ, ваша система станет незаметно сломанной и склонной к тупиковой ситуации при высоких нагрузках. Установка слишком большого значения мгновенно отключит вашу машину».
Проверим текущее значение vm.min_free_kbytes
sysctl vm.min_free_kbytes или так cat /proc/sys/vm/min_free_kbytes
Как ясно из названия настройки, значение выставляется в килобайтах. Установим значение в 1ГБ командой
sysctl -w vm.min_free_kbytes=1048576 или так echo 1048576 > /proc/sys/vm/min_free_kbytes
Чтобы настройка не потерялась после перезагрузки:
echo "vm.min_free_kbytes=1048576" >> /etc/sysctl.conf
Проверим вывод free -m и убедимся что мы зарезервировали таким образом +1ГБ свободной памяти для операций ядра. Данная настройка подойдет для количества общей (total) памяти ОЗУ = 64ГБ. На меньших/больших объемах озу, значение vm.min_free_kbytes будет верным выставить до 1.5 — 2% от общего объема памяти. И ошибок page allocation failure: order:2, mode мы больше не повстречаем.