Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ / /

Otimização de desempenho do TCMalloc para uma implantação autogerenciada

Nesta página

  • Suporte a plataformas
  • Habilitar hugepages transparentes (THP)
  • Habilitar caches por CPU
  • Saiba mais

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:

  • Use umsistema operacional compatível com .

  • Ative o THP.

  • Ative caches por CPU.

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.

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.

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:

1

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.

2

Para recarregar os arquivos de unidade systemd e disponibilizar enable-transparent-huge-pages.service para uso, execute o seguinte comando:

sudo systemctl daemon-reload
3

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
4

Para garantir que essa configuração seja aplicada sempre que o sistema operacional for iniciado, execute o seguinte comando:

sudo systemctl enable enable-transparent-huge-pages
5

Se você usar perfis tuned ou ktune em RHEL/CentOS, também deverá criar um perfil tuned personalizado.

1

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
2

Executar:

sudo chmod 755 /etc/init.d/enable-transparent-hugepages
3

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
4

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
sudo update-rc.d enable-transparent-hugepages defaults
SUSE
sudo insserv /etc/init.d/enable-transparent-hugepages
Red Hat, CentOS, Amazon Linux e derivados
sudo chkconfig --add enable-transparent-hugepages
5

Se você estiver usando perfis tuned ou ktune no RHEL/ CentOS, também deverá criar um perfil tuned personalizado.

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.

1

Crie um novo diretório para armazenar o perfil tuned personalizado. O exemplo a seguir herda do perfil virtual-guest existente e usa virtual-guest-thp como o novo perfil:

sudo mkdir /etc/tuned/virtual-guest-thp
2

Criar e editar /etc/tuned/virtual-guest-thp/tuned.conf. Adicione o seguinte texto:

[main]
include=virtual-guest
[vm]
transparent_hugepages=always

Este exemplo herda do perfil virtual-guest existente. Selecione o perfil apropriado para o seu sistema.

3

Executar:

sudo tuned-adm profile virtual-guest-thp
1

Para criar um novo perfil a partir de um perfil existente, copie o diretório relevante. O exemplo seguinte utiliza o perfil virtual-guest como base e utiliza virtual-guest-thp como o novo perfil:

sudo cp -r /etc/tune-profiles/virtual-guest /etc/tune-profiles/virtual-guest-thp
2

Edite /etc/tune-profiles/virtual-guest-thp/ktune.sh e altere a configuração set_transparent_hugepages da seguinte forma:

set_transparent_hugepages always
3

Habilite o novo perfil:

sudo tuned-adm profile virtual-guest-thp

Para verificar se o TCMalloc está em execução com caches por CPU, certifique-se de que:

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.

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

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

Voltar

Desempenho