¿Cómo modifico "/ sys / kernel / mm / transparent_hugepage / enabled"

50

Yo uso mongodb 3.0 y encuentro una advertencia:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

~# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

Intento usar echo, pero no es permanente, después de reiniciar se restablecerá.

echo never > /sys/kernel/mm/transparent_hugepage/defrag

¿Cómo modifico /sys/kernel/mm/transparent_hugepage/enabledpermanentemente?

Feng Yu
fuente
1
Puede haber buenas respuestas a continuación, pero en mi opinión, debería consultar la documentación oficial de MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Respuestas:

70

Usted puede

  1. instale el sysfsutilspaquete:

    sudo apt install sysfsutils
    
  2. y agregue una línea con esa configuración a /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Esta es la solución más limpia, porque mantiene toda la configuración de sysfs en un solo lugar en lugar de depender de scripts de inicio personalizados. Las otras respuestas, con los scripts y las expresiones condicionales, son adecuadas si no sabe a través de qué ruta el kernel expondrá esa configuración, es decir, si ni siquiera tiene una idea aproximada de la versión del kernel que se ejecuta en la máquina afectada.

David Foerster
fuente
44
Esto no hizo nada para mí en Ubuntu 14.04 en una instancia de AWS EC2. No sé mucho sobre sysfs.conf, pero parece ser una configuración compatible con Ubuntu, sin embargo, el archivo no existía en nuestro sistema anteriormente, y agregarlo y reiniciar no cambió en absoluto las advertencias de salida de mongo. También probé el consejo de clayzermk1 a continuación, todavía apareció la advertencia de 'desfragmentación'. El script de inicio oficial de mongo docs eliminó ambas advertencias.
Neek
¿Cuál es el resultado de cat /sys/kernel/mm/transparent_hugepage/enabled? ¿Existe en absoluto? sysfs.confnormalmente se evalúa en el arranque por /etc/init.d/sysutils. ¿Está habilitado? ¿Qué sucede cuando invocas /etc/init.d/sysutils start?
David Foerster
3
Tampoco tengo sysfs.confarchivo y /etc/init.d/sysutils. ubuntu 16.04
HEX
1
@unhammer: No, los dos tienen un alcance diferente. sysctles para configuraciones que también podría lograr con los parámetros del kernel; sysfs.confes para entradas en /sys.
David Foerster
1
@navossoc: ¿Podría abrir una nueva pregunta si tiene una pregunta nueva o de seguimiento? La sección de comentarios no es adecuada ni está destinada a nuevas preguntas o discusiones extensas. Puede enviarme un comentario con una notificación para llamar mi atención. Gracias.
David Foerster
25

Los documentos de MongoDB tienen algunas sugerencias. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

La forma "preferida" es editar /etc/default/gruby agregar transparent_hugepage=nevery GRUB_CMDLINE_LINUX_DEFAULTluego ejecutar update-grubpara reconstruir la configuración de GRUB.

El siguiente dos líneas hará exactamente eso. ¡Asegúrese de verificar la salida!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

Tenga en cuenta que update-grubes un contenedor para grub-mkconfig. grub-mkconfiggolpeará las entradas /etc/default/grubcon las de /etc/default/grub.d/*. Si por casualidad se está ejecutando en AWS, deberá editar en su lugar /etc/default/grub.d/50-cloudimg-settings.cfg.

El método "alternativo" es editar /etc/rc.localy agregar lo siguiente antes exit 0:

if test -f /sys/kernel/mm/transparent_hugepage/khugepaged/defrag; then
  echo 0 > /sys/kernel/mm/transparent_hugepage/khugepaged/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
  echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

Personalmente, terminé haciendo los métodos "preferidos" y "alternativos" ya que no son mutuamente excluyentes y elimina la advertencia sobre la desfragmentación.

* Me funcionó en Ubuntu 14.04, MongoDB 3.0.2 y AWS.

clayzermk1
fuente
Probé esto en mi servidor de aplicaciones MongoDB de un clic en DigitalOcean y no funcionó. Todavía recibo el mismo mensaje de advertencia.
scaryguy
Gracias por la parte sobre EC2 y50-cloudimg-settings.cfg
Martin Konecny
16

Aquí hay una solución que ha sido probada para funcionar en Ubuntu 16.04 en AWS EC2. Ubuntu 16.04 usa el sistema systemd init, y este archivo de configuración expresa que esta configuración debe cambiarse antes de que se inicie MongoDB.

Cree un archivo llamado /etc/systemd/system/mongodb-hugepage-fix.servicey agregue el siguiente contenido:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

Para cargar el archivo en systemd:

systemctl daemon-reload

Para activar el archivo como una dependencia del tiempo de arranque de MongoDB

systemctl enable mongodb-hugepage-fix

Si desea activar los cambios inmediatamente (antes del próximo arranque)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Esta solución no es adecuada para Ubuntu 14.04, que usa la solución de inicio Upstart en lugar de systemd.

Mark Stosberg
fuente
1
La solución systemd es perfecta para las instalaciones modernas de MongoDB, gracias.
four43
7

Agregue las siguientes líneas a continuación en /etc/rc.local.

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
  echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

Esto se ejecutará cuando reinicie el servidor.

PKumar
fuente
1
¿Hay un archivo de configuración sobre esto? rc.localno es una buena idea, porque rc.local se ejecutará al final del inicio del sistema. Por lo tanto, el servicio mongodb seguirá utilizando la configuración predeterminada.
Feng Yu
2
edite el archivo / etc / default / grub y realice cambios en la línea "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "y ejecute el comando update-grub y luego reinicie el servidor
PKumar
2
Gracias funciona. Pero, ¿hay una forma similar de modificar /sys/kernel/mm/transparent_hugepage/defrag? Cuando reinicio, mongo shell también me dice "** ADVERTENCIA: / sys / kernel / mm / transparent_hugepage / defrag es 'siempre'".
Feng Yu
@FengYu prueba esta página docs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar
0

GRUB cambiará después de la actualización, y rc.local se ejecutará solo después de que se inicie mongo, por lo que tal vez deberíamos agregar el servicio de reinicio de mongo al final de rc.local de esta manera

si prueba -f / sys / kernel / mm / transparent_hugepage / enabled; entonces
  echo nunca> / sys / kernel / mm / transparent_hugepage / enabled
fi

if prueba -f / sys / kernel / mm / transparent_hugepage / defrag; entonces
   echo nunca> / sys / kernel / mm / transparent_hugepage / defrag
fi

espere 1 && servie mongod reiniciar

¿O tal vez alguien agregó con éxito las líneas anteriores al script de inicio en Ubuntu 14.04?

Edik Mkoyan
fuente
0

Como estamos implementando máquinas con Ansible, no me gusta modificar archivos rc.

Intenté usar sysfsutils/ sysfs.confpero me encontré con problemas de sincronización al iniciar los servicios en máquinas rápidas (o lentas). Parecía que a veces mongod se iniciaba antes que sysfsutils. A veces funcionaba, a veces no.

Como mongod es un proceso inicial, descubrí que la solución más limpia era agregar el archivo /etc/mongo_vm_settings.confcon el siguiente contenido:

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf
#
#   This file will set the correct kernel VM settings for MongoDB
#   This file is maintained in Ansible

start on (starting mongod)
script
  echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
end script

Esto ejecutará el script justo antes de que se inicie mongod. Reinicie mongod ( sudo service mongod restart) y listo.

Whyhankee
fuente
Tenga en cuenta que esta solución utiliza el sistema init "Upstart", mientras que Ubuntu 16.04 se basa en el sistema systemd init.
Mark Stosberg
0

Después de leer un poco en el registro de advertencia, he agregado estas dos líneas en /etc/sysfs.confy voilá

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

Reinicie la máquina después de aplicar estos cambios.

Ulv3r
fuente
Eso todavía requiere el sysfsutilspaquete (ver mi respuesta).
David Foerster
seguramente es necesario
Ulv3r