Solventar problema «transparent_hugepage warning» en mongodb

De aquí a un tiempo estaba teniendo problemas con el servicio de MongoDB en un sistema de Foreman/Katello. Esto hacía que fallasen las tareas programadas que se encargaban de sincronizar repositorios o vistas de contenido.

La solución la he encontrado revisando los registros de MongoDB, donde aparecían estos mensajes:

**  WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
**  We suggest setting it to 'never'

Entonces, como pasa en la mayoría de los casos he encontrado la solución por los mares de Internet, de hecho, más abajo os he dejado los enlaces que he consultado.

Logo de Foreman

La solución al problema «transparent_hugepage warning» en MongoDB

La solución finalmente la encontramos en la propia documentación de MongoDB. De hecho, el programa vienen de un sistema llamado «Transparent Huge Pages (THP)«. Este es un sistema de administración de memoria de Linux que reduce la sobrecarga de las búsquedas de «Translation Lookaside Buffer (TLB)» en máquinas con grandes cantidades de memoria mediante el uso de páginas de memoria más grandes.

Sin embargo, las cargas de trabajo de la base de datos a menudo funcionan mal con THP habilitado, porque tienden a tener patrones de acceso a la memoria dispersos en lugar de contiguos. Al ejecutar MongoDB en Linux, THP debe estar deshabilitado para obtener el mejor rendimiento.

Para asegurarnos de que THP esté desactivado antes de que se inicie mongod, debemos crear un archivo de servicio para el sistema de inicialización de su plataforma que desactive THP en el arranque. A continuación vemos como hacerlo en un sistema con Systemd

Creamos el fichero de servicio

Para crear un archivo de servicio que deshabilite THP, utilizará el sistema de inicialización incorporado para nuestra plataforma. Las versiones recientes de GNU/Linux tienden a usar systemd (que usa el comando systemctl), mientras que las versiones anteriores de GNU/Linux tienden a usar System V init (que usa el comando de servicio).

Creamos el fichero con la información de la unidad de servicio:

[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
 
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled > /dev/null'
 
[Install]
WantedBy=basic.target

Cosas a tener en cuenta

En algunas versiones de RHEL la ruta de THP es otra:

/sys/kernel/mm/redhat_transparent_hugepage/enabled

Si esto es así hay que cambiar la unidad de Systemd que queremos crear.

Antes de la versión 4.2, MongoDB también verifica la configuración de desfragmentación de THP y presenta una advertencia de inicio si la desfragmentación está habilitada. Siempre que THP esté deshabilitado en el archivo de la unidad systemd, MongoDB no se ve afectado por la configuración de desfragmentación. Sin embargo, para evitar este mensaje, podemos establecer la desfragmentación en nunca agregando la siguiente línea adicional al archivo de la unidad systemd, justo después de la instrucción ExecStart existente:

ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'

Recuerda que según la versión de RHEL la ruta de THP puede ser diferente, como hemos comentado antes.

Recargar las unidades de systemd

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

sudo systemctl daemon-reload

Encendemos el servicio

Iniciamos el servicio manualmente una vez para asegurarmos de que se haya cambiado la configuración de THP adecuada:

sudo systemctl start disable-transparent-huge-pages

Verificamos que THP se haya configurado correctamente en [never] ejecutando el siguiente comando:

cat /sys/kernel/mm/transparent_hugepage/enabled

En Red Hat Enterprise Linux y potencialmente en otros derivados basados en Red Hat, es posible que debamos usar lo siguiente:

cat /sys/kernel/mm/redhat_transparent_hugepage/enabled

Añadir la unidad al arranque

Para asegurarnos de que esta configuración se aplique cada vez que se inicie el sistema, ejecutamos el siguiente comando:

sudo systemctl enable disable-transparent-huge-pages

Usar tuned y ktune

Si usamos tuned o ktune, también debemos realizar los pasos de esta sección además de realizar el paso anterior.

tuned y ktune son herramientas dinámicas de ajuste del kernel que pueden afectar la configuración de páginas grandes transparentes en nuestro sistema. Si estamos usando tuned/ktune en nuestro sistema RHEL/CentOS mientras ejecutamos mongod, debemos crear un perfil personalizado para asegurarnos de que THP permanezca deshabilitado.

En RHEL y Centos 7 y similares, debemos seguir estos pasos.

Creamos una nueva unidad:

Creamos un nuevo directorio para contener el perfil ajustado personalizado. Este ejemplo se hereda del perfil de invitado virtual existente y usa virtual-guest-no-thp como el nuevo perfil:

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

Editamos tuned.conf

Creamos y editamos /etc/tuned/virtual-guest-no-thp/tuned.conf para que contenga lo siguiente:

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

Habilitamos la nueva unidad:

sudo tuned-adm profile virtual-guest-no-thp

Info:

MongoDB – Disable Transparent Huge Pages (THP)

Stackoverflow – How to avoid transparent_hugepage/defrag warning from mongodb?