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 utiliza una versión mejorada de TCMalloc que utiliza cachés por CPU, en lugar de cachés por subproceso, para reducir la fragmentación de la memoria y hacer que su base de datos sea más resistente a cargas de trabajo de alto estrés.

Para utilizar la nueva versión de TCMalloc:

  • Utilice 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 versiones posteriores, asegúrese de que THP esté habilitado antes mongodcomienza creando un archivo de servicio para el sistema de inicialización de su plataforma. Si usa MongoDB 7.0 o una versiónanterior, 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 En los sistemasRHEL y CentOS que utilizan ktune tuned perfiles de rendimiento y, también debe crear un tuned perfil 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 se utilizan los perfiles tuned o ktune en RHEL/CentOS, también se debe crear un perfil tuned personalizado.

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 está 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 el sistema. Si se está utilizando tuned o ktune en el sistema RHEL o CentOS mientras se ejecuta mongod, se debe crear un perfil tuned personalizado para asegurarse de que THP permanezca activado.

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 asegurar que TCMalloc pueda usar rseq para activar cachés por CPU, se puede desactivar el registro de glibc de una estructura rseq. Para desactivar glibc rseq, se debe establecer la siguiente variable de entorno antes de que se inicie mongod:

GLIBC_TUNABLES=glibc.pthread.rseq=0
export GLIBC_TUNABLES

Si ha desactivado glibc rseq y las cachés por CPU aún no están activadas, se deber verificar que se está utilizando la versión 4.18 o posterior del kernel de Linux. Para comprobar la versión de kernel, se debe ejecutar el siguiente comando:

uname -r

Volver

Configuraciones de ulimit de UNIX

En esta página