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

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

Utilizo 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?

Respuesta1

Puede

  1. instalar 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 sabes a través de qué ruta el kernel expondrá esa configuración, es decir, si ni siquiera tienes una idea aproximada de la versión del kernel que se ejecuta en la máquina afectada.

Respuesta2

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=neverpara GRUB_CMDLINE_LINUX_DEFAULTluego ejecutar update-gruby reconstruir la configuración de GRUB.

Las siguientes dos líneas harán precisamente eso. ¡Asegúrese de verificar el resultado!

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 está ejecutando en AWS, deberá editar el archivo /etc/default/grub.d/50-cloudimg-settings.cfg.

El método "alternativo" consiste en 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é usando los métodos "preferido" y "alternativo", ya que no son mutuamente excluyentes y eliminan la advertencia sobre la desfragmentación.

* Funcionó para mí en Ubuntu 14.04, MongoDB 3.0.2 y AWS.

Respuesta3

Aquí hay una solución que se ha probado para funcionar en Ubuntu 16.04 en AWS EC2. Ubuntu 16.04 usa el sistema de inicio systemd y este archivo de configuración expresa que estas configuraciones deben 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 de 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 esnoadecuado para Ubuntu 14.04, que utiliza la solución Upstart init en lugar de systemd.

Respuesta4

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

Intenté usar sysfsutils/ sysfs.confpero encontré 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 funcionó, a veces no.

Dado que mongod es un proceso advenedizo, 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. Reinicia mongod ( sudo service mongod restart) y listo.

información relacionada