Temos vários servidores de pilha Centos 7 LAMP de uso geral que executam o Apache com bancos de dados MariaDB subjacentes.
Dos documentos do RedHat Performance Tuning para RHEL 6 :
Transparent Hugepages (THP) esconde grande parte da complexidade no uso de páginas enormes de administradores de sistema e desenvolvedores. Como o objetivo do THP é melhorar o desempenho, seus desenvolvedores (tanto da comunidade quanto da Red Hat) testaram e otimizaram o THP em uma ampla variedade de sistemas, configurações, aplicativos e cargas de trabalho. Isso permite que as configurações padrão do THP melhorem o desempenho da maioria das configurações do sistema. No entanto, o THP não é recomendado para cargas de trabalho de banco de dados.
O que parece ótimo, até a seção de banco de dados. Na verdade, algumas das opções do MariaDB, como o mecanismo TokuDB, exigem que o THP seja desativado.
Muitos dos guias que encontrei para desabilitar o THP instruem a alteração da configuração padrão de transparent_hugepages= always
para never
.
No entanto, dos documentos do RedHat Performance Tuning para RHEL 7 :
Para evitar que os aplicativos aloquem mais recursos de memória do que o necessário, você pode desabilitar páginas enormes em todo o sistema e habilitá-las apenas dentro das regiões MADV_HUGEPAGE madvise
Se eu li certo, transparent_hugepages= madvise
parece uma opção muito melhor, permitindo que processos que se beneficiam do THP os usem e aqueles que não o fazem não.
Eu encontrei um artigo sugerindo essa abordagem.
Por que essa não é a opção padrão?
Existem situações em que usar transparent_hugepages= never
é mais sábio do que madvise
?
É a diferença entre opt-in (madvise) e opt-out (sempre). Os aplicativos que são sensíveis ao THP podem ser excluídos mesmo sob
transparent_hugepages=always
. Por exemplo, aplicativos que usam jemalloc são notavelmente sensíveis a ele (redis, go rt, rust rt) e jemalloc oferece a opção em tempo de compilação como parte da configuração do alocador para usar MADV_NOHUGEPAGE. Começando com o kernel 3.15 (RHEL7 vem com 3.10), eles podem optar por sair por processo usandoprctl(PR_SET_THP_DISABLE)
.O padrão
always
geralmente deve ser bom porque a localidade de dados é uma propriedade muito comum para aplicativos que fazem grandes alocações. Os bancos de dados são a exceção notável em que sofrem por acessar pequenos fragmentos em um grande número de alocações grandes (e podem desabilitar o THP).A documentação do kernel para páginas enormes transparentes sugere que
transparent_hugepage=never
é mais uma opção de depuração do que uma solução recomendada. É preferível apenastransparent_hugepage=madvise
quando o software está com bugs; ou seja. quando o desenvolvedor está usando MADV_HUGEPAGE incorretamente.