Docs Menu
Docs Home
/

Optimización del rendimiento de TCMalloc para una implementación autogestionada

Cambiado en la versión 8.0.

A partir de MongoDB 8.0, MongoDB usa una versión mejorada de TCMalloc que utiliza cachés por CPU, en vez de cachés por hilo, para reducir la fragmentación de la memoria y hacer que tu base de datos sea más resiliente a cargas de trabajo de alto estrés.

Para utilizar la nueva versión de TCMalloc:

  • Utiliza un sistema operativo compatible.

  • Activar THP.

  • Activar las cachés por CPU.

Los sistemas operativos que dan soporte a MongoDB 8.0 también dan soporte al TCMalloc actualizado, excepto los siguientes:

  • RHEL 8 / Oracle 8 en las arquitecturas PPC64LE y s390x

  • RHEL 9 / CentOS 9 / Oracle 9 en la arquitectura PPC64LE

Estos sistemas operativos utilizan la versión heredada de TCMalloc. Si se utilizan estos sistemas operativos, se debe desactivar THP.

Windows utiliza la versión heredada de TCMalloc y no tiene soporte para la versión actualizada de TCMalloc.

Transparent Hugepages (THP) es un sistema de gestión de memoria de Linux que reduce los gastos en general de las búsquedas en el Translation Lookaside Buffer (TLB). THP logra esto combinando páginas pequeñas y haciendo que se presenten como páginas de memoria más grandes para la aplicación.

En MongoDB 8.0 y posteriores, asegúrese de que THP esté habilitado antes de mongod comienza creando un archivo de servicio para el sistema de inicialización de tu plataforma. Si utiliza MongoDB 7.0 o anterior, desactive THP.

Nota

THP opera a nivel de sistema, por lo que se aplica a todos los procesos del sistema. No puede activar ni desactivar THP a nivel de proceso.

Además, para Sistemas RHEL y CentOS que utilizan perfiles de rendimiento ktune y tuned, también se debe crear un perfil de tuned personalizado.

Para crear un archivo de servicio que active THP, se debe utilizar el sistema de inicialización integrado para la plataforma. Las versiones recientes de Linux suelen usar systemd, que utiliza el comando systemctl. Las versiones antiguas de Linux tienden a usar System V init, que emplea el comando service. Para aprender más, se puede consultar la documentación del sistema operativo.

Utilizar el sistema de inicialización para la plataforma:

1

Cree el siguiente archivo y guárdelo en /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

Nota

Algunas versiones de Red Hat Enterprise Linux, y potencialmente otros derivados basados en Red Hat, utilizan una ruta diferente para el archivo THP enabled:

/sys/kernel/mm/redhat_transparent_hugepage/enabled

Verificar qué ruta está en uso en el sistema y actualizar el archivo enable-transparent-huge-pages.service en consecuencia.

2

Para recargar los archivos de la unidad systemd y hacer que enable-transparent-huge-pages.service esté disponible para su uso, ejecute el siguiente comando:

sudo systemctl daemon-reload
3

Ejecuta:

sudo systemctl start enable-transparent-huge-pages

Para verificar que los ajustes relevantes de THP han cambiado, ejecute el siguiente 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

En Red Hat Enterprise Linux y, posiblemente, en otros derivados basados en Red Hat, es posible que se necesite utilizar lo siguiente:

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

La salida debería asemejarse a lo siguiente:

always
defer+madvise
0
1
4

Para asegurarse de que esta configuración se aplique cada vez que se inicie el sistema operativo, ejecute el siguiente comando:

sudo systemctl enable enable-transparent-huge-pages
5

Si utiliza perfiles tuned o ktune en RHEL/ CentOS, también debe crear un perfil personalizado tuned.

1

Cree el siguiente archivo y guárdelo en /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

Ejecuta:

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

Ejecuta:

sudo /etc/init.d/enable-transparent-hugepages start

Para verificar que los ajustes relevantes de THP han cambiado, ejecute el siguiente 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

En Red Hat Enterprise Linux y, posiblemente, en otros derivados basados en Red Hat, es posible que se necesite utilizar lo siguiente:

cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

La salida debería asemejarse a lo siguiente:

always
defer+madvise
0
1
4

Para asegurarse de que esta configuración se aplique cada vez que se inicie el sistema operativo, ejecute el siguiente comando para su distribución de Linux:

Distribución
Comando

Ubuntu y Debian

sudo update-rc.d enable-transparent-hugepages defaults

SUSE

sudo insserv /etc/init.d/enable-transparent-hugepages

Red Hat, CentOS, Amazon Linux y derivados

sudo chkconfig --add enable-transparent-hugepages
5

Si se están utilizando perfiles tuned o ktune en RHEL/CentOS, también se debe crear un perfil de tuned personalizado.

Importante

Si se utiliza tuned o ktune, realizar los pasos de esta sección después de crear el archivo de servicio.

tuned y ktune son utilidades de ajuste del kernel que pueden afectar la configuración de Transparent Hugepages en su sistema. Si está utilizando tuned o ktune en su sistema RHEL o CentOS mientras mongod ejecuta, debe crear un tuned perfil personalizado para garantizar que THP permanezca habilitado.

1

Crear un nuevo directorio para almacenar el perfil personalizado de tuned. El siguiente ejemplo hereda del perfil virtual-guest existente y utiliza virtual-guest-thp como el nuevo perfil:

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

Cree y edite /etc/tuned/virtual-guest-thp/tuned.conf. Añada el siguiente texto:

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

Este ejemplo hereda del perfil virtual-guest existente. Seleccionar el perfil adecuado para el sistema.

3

Ejecuta:

sudo tuned-adm profile virtual-guest-thp

Para verificar que TCMalloc se está ejecutando con cachés por CPU, asegúrese de que:

Si las cachés por CPU no están activadas, se debe verificar que:

  • Deshabilitar glibc rseq.

  • La versión del kernel de Linux 4.18 o posterior está en uso.

El nuevo TCMalloc requiere Restartable Sequences (rseq) para implementar cachés por CPU. Si otra aplicación, como la librería glibc, registra una estructura rseq antes que TCMalloc, TCMalloc no puede utilizar rseq. Sin rseq, TCMalloc utiliza cachés por subproceso, que son utilizadas por la versión heredada de TCMalloc.

Para habilitar las cachés por CPU, desactive el registro rseq de glibc configurando la siguiente variable de entorno antes de iniciar mongod:

GLIBC_TUNABLES=glibc.pthread.rseq=0
export GLIBC_TUNABLES

Si las cachés por CPU siguen sin estar habilitadas después de deshabilitar glibc rseq, verifique que esté utilizando el kernel de Linux 4.18 o posterior:

uname -r

Volver

Configuraciones de ulimit de UNIX

En esta página