У нас есть несколько стековых серверов Centos 7 LAMP общего назначения, которые запускают apache с базами данных MariaDB.
Из Документация по настройке производительности RedHat для RHEL 6:
Trasparent Hugepages (THP) скрывает большую часть сложности использования огромных страниц от системных администраторов и разработчиков. Поскольку целью THP является повышение производительности, его разработчики (как из сообщества, так и из Red Hat) протестировали и оптимизировали THP для широкого спектра систем, конфигураций, приложений и рабочих нагрузок. Это позволяет использовать настройки THP по умолчанию для повышения производительности большинства конфигураций системы. Однако THP не рекомендуется для рабочих нагрузок баз данных.
Звучит здорово, вплоть до раздела базы данных. Фактически, некоторые параметры MariaDB, такие как движок TokuDB, действительно требуют отключения THP.
Многие найденные мной руководства по отключению THP инструктируют изменить конфигурацию по умолчанию с transparent_hugepages= always
к never
.
Однако из Документация по настройке производительности RedHat для RHEL 7:
Чтобы приложения не выделяли больше ресурсов памяти, чем необходимо, вы можете отключить огромные страницы в масштабе всей системы и включить их только в регионах madvise MADV_HUGEPAGE.
Если я правильно прочитал, transparent_hugepages= madvise
кажется гораздо лучшим вариантом, позволяющим процессам, которые выигрывают от THP, использовать их, а другим - нет.
Я нашел одна статья предлагая такой подход.
Почему это не вариант по умолчанию?
Есть ли ситуации, когда использование transparent_hugepages= never
мудрее, чем madvise
?
В этом разница между включением (madvise) и отказом (всегда). Приложения, чувствительные к THP, могут отказаться даже в transparent_hugepages=always
. Например, приложения, использующие jemalloc, особенно чувствительны к нему (redis, go rt, rust rt), а jemalloc предлагает возможность во время компиляции как часть конфигурации распределителя использовать MADV_NOHUGEPAGE. Начиная с ядра 3.15 (RHEL7 поставляется с 3.10), они могут отказаться для каждого процесса, используя prctl(PR_SET_THP_DISABLE)
.
По умолчанию always
обычно должно быть хорошо, потому что локальность данных - очень распространенное свойство для приложений, выделяющих большие объемы памяти. Базы данных являются заметным исключением, когда они страдают из-за доступа к небольшим фрагментам при большом количестве больших распределений (и они могут отключить THP).
Документация ядра для прозрачные огромные страницы предполагает, что transparent_hugepage=never
это скорее вариант отладки, чем рекомендуемое решение. Только предпочтительнее transparent_hugepage=madvise
когда программное обеспечение глючит; т.е. когда разработчик неправильно использует MADV_HUGEPAGE.