Otimização de desempenho do TCMalloc para uma implantação autogerenciada
Nesta página
Alterado na versão 8.0.
A partir do MongoDB 8.0, O MongoDB usa uma versão atualizada do TCMalloc que usa caches por CPU, em vez de caches por thread, para reduzir a fragmentação da memória e tornar seu banco de dados de dados mais resiliente a cargas de trabalho de alto estresse.
Para usar a nova versão do TCMalloc:
Suporte a plataformas
Os sistemas operacionais compatíveis com o MongoDB 8.0 também oferecem suporte ao TCMalloc atualizado, exceto para o seguinte:
RHEL 8 / CentOS 8 / Oracle 8 nas arquiteturas PPC64LE e s390x
RHEL 9 / CentOS 9 / Oracle 9 na arquitetura PPC64LE
Esses sistemas operacionais usam a versão legado do TCMalloc. Se você usar esses sistemas operacionais, desative o THP.
Habilitar hugepages transparentes (THP)
Transparent Hugepages (THP) é um sistema de gerenciamento de memória Linux que reduz a sobrecarga de pesquisas de TRB (Translation Lookaside Buffer). O THP consegue isso combinando páginas pequenas e fazendo com que apareçam como páginas de memória maiores para o aplicação.
No MongoDB 8.0 e posterior, certifique-se de que o THP esteja ativado antes mongod
começar criando um arquivo de serviço para o sistema de inicialização da sua plataforma. Se você estiver usando o MongoDB 7.0 ou anterior, desative o THP.
Observação
Você pode ativar o THP no nível do sistema e desativá-lo no nível do processo. Se você tiver vários processos do MongoDB em um único computador, certifique-se de que os processos na versão 8.0 habilitem o THP, enquanto os processos na 7.0 ou anterior desabilitem o THP.
Além disso, para sistemas RHEL e CentOS que usam perfis de desempenho ktune
e tuned
, você também deve criar um perfil tuned
personalizado.
Crie um arquivo de serviço
Para criar um arquivo de serviço que habilite THP, use o sistema de inicialização integrado para sua plataforma. Versões recentes do Linux normalmente utilizam systemd, que utiliza o comando systemctl
. Versões mais antigas do Linux tendem a usar o System V init, que usa o comando service
. Para obter mais informações, consulte a documentação do seu sistema operacional.
Use o sistema de inicialização para sua plataforma:
Crie o systemd
arquivo de unidade
Crie o seguinte arquivo e salve-o em /etc/systemd/system/enable-transparent-huge-pages.service
:
[Unit] Description=Enable Transparent Hugepages (THP) DefaultDependencies=no After=sysinit.target local-fs.target Before=mongod.service [Service] Type=oneshot ExecStart=/bin/sh -c 'echo always | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null && echo defer+madvise | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null && echo 0 | tee /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' [Install] WantedBy=basic.target
Observação
Algumas versões do Red Hat Enterprise Linux, e possivelmente outros derivados baseados no Red Hat, usam um caminho diferente para o arquivo THP enabled
:
/sys/kernel/mm/redhat_transparent_hugepage/enabled
Verifique qual caminho está em uso em seu sistema e atualize o arquivo enable-transparent-huge-pages.service
de acordo.
Iniciar o serviço
Executar:
sudo systemctl start enable-transparent-huge-pages
Para verificar se as configurações relevantes do THP foram alteradas, execute o seguinte comando:
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
No Red Hat Enterprise Linux, e possivelmente em outros derivados baseados no Red Hat, talvez você precise usar o seguinte:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled && cat /sys/kernel/mm/redhat_transparent_hugepage/defrag && cat /sys/kernel/mm/redhat_transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
A saída deve se assemelhar ao seguinte:
always defer+madvise 0 1
Crie o init.d
script
Crie o seguinte arquivo e salve-o em /etc/init.d/enable-transparent-hugepages
:
!/bin/bash ## BEGIN INIT INFO Provides: enable-transparent-hugepages Required-Start: $local_fs Required-Stop: X-Start-Before: mongod mongodb-mms-automation-agent Default-Start: 2 3 4 5 Default-Stop: 0 1 6 Short-Description: Enable Linux Transparent Hugepages Description: Enable Linux Transparent Hugepages, to improve database performance. ## END INIT INFO case $1 in start) if [ -d /sys/kernel/mm/transparent_hugepage ]; then thp_path=/sys/kernel/mm/transparent_hugepage elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then thp_path=/sys/kernel/mm/redhat_transparent_hugepage else return 0 fi echo 'always' | tee ${thp_path}/enabled > /dev/null && echo defer+madvise | tee ${thp_path}/defrag > /dev/null && echo 0 | tee ${thp_path}/khugepaged/max_ptes_none > /dev/null && echo 1 | tee /proc/sys/vm/overcommit_memory > /dev/null' unset thp_path ;; esac
Execute o script
Executar:
sudo /etc/init.d/enable-transparent-hugepages start
Para verificar se as configurações relevantes do THP foram alteradas, execute o seguinte comando:
cat /sys/kernel/mm/transparent_hugepage/enabled && cat /sys/kernel/mm/transparent_hugepage/defrag && cat /sys/kernel/mm/transparent_hugepage/khugepaged/max_ptes_none && cat /proc/sys/vm/overcommit_memory
No Red Hat Enterprise Linux, e possivelmente em outros derivados baseados no Red Hat, talvez você precise usar o seguinte:
cat /sys/kernel/mm/redhat_transparent_hugepage/enabled
A saída deve se assemelhar ao seguinte:
always defer+madvise 0 1
Configure seu sistema operacional para executá-lo na inicialização.
Para garantir que essa configuração seja aplicada sempre que o sistema operacional for iniciado, execute o seguinte comando para sua distribuição Linux:
Distribuição | Comando | |
---|---|---|
Ubuntu e Debian |
| |
SUSE |
| |
Red Hat, CentOS, Amazon Linux e derivados |
|
Uso de e tuned
ktune
Importante
Se você usar tuned
ou ktune
, execute as etapas nesta seção após criar o arquivo de serviço.
tuned
e ktune
são utilitários de ajuste do kernel que podem afetar a configuração de Transparent Hugepages em seu sistema. Se você estiver usando tuned
ou ktune
no seu sistema RHEL ou CentOS enquanto estiver executando mongod
, será necessário criar um perfil tuned
personalizado para garantir que o THP permaneça ativado.
Habilitar caches por CPU
Para verificar se o TCMalloc está em execução com caches por CPU, certifique-se de que:
tcmalloc.usingPerCPUCaches
étrue
.tcmalloc.tcmalloc.cpu_free
é superior a0
.
Se os caches por CPU não estiverem ativados, certifique-se de que:
Você desabilita o rseq do glibc.
Você estiver usando o Linux kernel versão 4.18 ou posterior.
Desativar rseq do Glibc
O novo TCMalloc requer Sequências Reiniciáveis (rseq) para implementar caches por CPU. Se outro aplicação, como a biblioteca glibc, registrar uma estrutura rseq antes do TCMalloc, o TCMalloc não poderá usar o rseq. Sem rseq, o TCMalloc usa caches por thread, que são usados pela versão legado do TCMalloc.
Para garantir que o TCMalloc possa usar o rseq para habilitar caches por CPU, você pode desabilitar o registro de Glibc de uma estrutura rseq. Para desativar o glibc rseq, defina a seguinte variável de ambiente antes de iniciar o mongod
:
GLIBC_TUNABLES=glibc.pthread.rseq=0 export GLIBC_TUNABLES
Verificar versão do kernel
Se você desativou o glibc rseq e os caches por CPU ainda não estiverem ativados, verifique se está usando o Linux kernel versão 4.18 ou posterior. Para verificar sua versão do kernel, execute o seguinte comando:
uname -r