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/enabled
permanentemente?
Respuesta1
Puede
instalar el
sysfsutils
paquete:sudo apt install sysfsutils
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/grub
y agregar transparent_hugepage=never
para GRUB_CMDLINE_LINUX_DEFAULT
luego ejecutar update-grub
y 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-grub
es un contenedor para grub-mkconfig
. grub-mkconfig
golpeará las entradas /etc/default/grub
con 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.local
y 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.service
y 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.conf
pero 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.conf
con 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.