Ошибка Kernel: page page allocation failure: order, исправляем настройкой vm.min_free_kbytes

Что такое 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

Как ясно из названия настройки, значение выставляется в килобайтах. Установим значение в 1ГБ командой

Чтобы настройка не потерялась после перезагрузки:

Проверим вывод free -m и убедимся что мы зарезервировали таким образом +1ГБ свободной памяти для операций ядра. Данная настройка подойдет для количества общей (total) памяти ОЗУ = 64ГБ. На меньших/больших объемах озу, значение vm.min_free_kbytes будет верным выставить до 1.5 — 2% от общего объема памяти. И ошибок page allocation failure: order:2, mode мы больше не повстречаем.