dmesg: page allocation failure

Эта ошибка может возникать в системах любой конфигурации. Решение можно быстро нагуглить но само по себе оно не столько интересно нежели, то дополнительное понимание о памяти в Linux которое можно получить разобравшись в проблеме.

Итак, мы знаем, что есть Cache и Buffers под которые ядро может отдавать всю свободную память. Как бэ, чего ей простаивать — путь работает. Мы знаем, что эта память занятая кешами высвобождается при необходимости. То есть ее может получить любой нуждающийся процесс. То есть на нее можно рассчитывать как на свободную, думал я всегда.

Еще мы знаем, что есть swap в который как известно переносятся наименее используемые странички вирт. памяти, что является по сути расширением виртуальной памяти.

Глядя на вывод команды freeя всегда учитывал вышесказанное и при высокой утилизации памяти(не swap) я думал, ну в худшем случае провалимся в swap а там отработает мониторинг и будем либо добавлять память либо серверы, а пока все норм. Кстати у нас настроено использование swap только после утилизации памяти на 99%(vm.swappiness=1)и даже при этом swap остается коварным злом о котором я напишу отдельно.

Так вот, все немного не так как думал я. Есть ситуации когда память нужна вот прям сейчас, например при обработке прерываний и в этих ситуациях ядро не может ждать высвобождения памяти занятой кешем или пока старые страницы будут сброшены на диск в swap. В такие моменты возникает подобная ошибка. При этом не приходит OOM, это важно, это значит, что памяти как бы хватает. Хотя OOM возможно не приходит т.к. результатов его работы тоже долго ждать)

Значение параметра ядра: vm.min_free_kbytesпо умолчанию равно 90112 kb на CentOS 6.x/7.x.
Это резерв который ядро будет держать для себя и не отдаст под кеш или пользовательским процессам, что бы иметь возможность обслуживать подобные моментальные запросы. Собственно увеличение значения этого параметра решает проблему.

Важное замечание от инженеров RedHat, учтите его при выборе значения:

Be cautious when setting this parameter, as both too-low and,
too-high(5-10% of total system memory) values can be damaging and break your system.