J'utilise mongodb 3.0 et je trouve un avertissement:
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
J'essaie d'utiliser l'écho, mais ce n'est pas permanent, après le redémarrage, il sera réinitialisé.
echo never > /sys/kernel/mm/transparent_hugepage/defrag
Comment modifier /sys/kernel/mm/transparent_hugepage/enabled
de manière permanente?
Vous pouvez
installez le package sysfsutils
:
Sudo apt install sysfsutils
et ajoutez une ligne avec ce paramètre à /etc/sysfs.conf
:
kernel/mm/transparent_hugepage/enabled = never
C'est la solution la plus propre car elle conserve toute la configuration sysfs au même endroit au lieu de s'appuyer sur des scripts de démarrage personnalisés. Les autres réponses, avec les scripts et les expressions conditionnelles, conviennent si vous ne savez pas par quel chemin le noyau exposera ce paramètre, i. e. si vous n'avez même pas une idée approximative de la version du noyau s'exécutant sur la machine affectée.
Les documents MongoDB ont quelques suggestions. http://docs.mongodb.org/manual/reference/transparent-huge-pages/
La méthode "préférée" consiste à éditer /etc/default/grub
et à ajouter transparent_hugepage=never
à GRUB_CMDLINE_LINUX_DEFAULT
, puis à exécuter update-grub
pour reconstruire la configuration GRUB.
C'est ce que feront les deux lignes suivantes. Assurez-vous de vérifier le résultat!
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
Notez que update-grub
est un wrapper pour grub-mkconfig
. grub-mkconfig
masquera les entrées dans /etc/default/grub
avec celles de /etc/default/grub.d/*
. Si par hasard vous utilisez AWS, vous devrez plutôt éditer /etc/default/grub.d/50-cloudimg-settings.cfg
.
La méthode "alternate" consiste à éditer /etc/rc.local
et à ajouter ce qui suit avant 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
Personnellement, j'ai fini par utiliser les méthodes "préférée" et "alternative", car elles ne s'excluent pas mutuellement et élimine l'avertissement concernant la défragmentation.
* Travaillé pour moi sur Ubuntu 14.04, MongoDB 3.0.2 et AWS.
Voici une solution qui a été testée pour fonctionner sur Ubuntu 16.04 sur AWS EC2. Ubuntu 16.04 utilise le système systemd init et ce fichier de configuration indique que ces paramètres doivent être modifiés avant le démarrage de MongoDB.
Créez un fichier nommé /etc/systemd/system/mongodb-hugepage-fix.service
et ajoutez le contenu suivant:
[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
Pour charger le fichier dans systemd:
systemctl daemon-reload
Pour activer le fichier en tant que dépendance de MongoDB au démarrage
systemctl enable mongodb-hugepage-fix
Si vous souhaitez activer les modifications immédiatement (avant le prochain démarrage)
systemctl start mongodb-hugepage-fix
systemctl restart mongod
Cette solution est non appropriée pour Ubuntu 14.04, qui utilise la solution Upstart init au lieu de systemd.
Ajoutez les lignes suivantes ci-dessous dans /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
Cela fonctionnera lorsque vous redémarrez le serveur.
GRUB changera après la mise à niveau et rc.local ne fonctionnera qu’après le démarrage de mongo. Nous devrions peut-être ajouter le service mongo restart à la fin de rc.local comme ceci
si test -f/sys/kernel/mm/transparent_hugepage/enabled; then echo never> /sys/kernel/mm/transparent_hugepage/enabled fi[.____. Printer-test -f/sys/kernel/mm/transparent_hugepage/defrag; then echo never> /sys/kernel/mm/transparent_hugepage/defrag[.____. 139.fi[.____. Page_.____._revwait 1 && servie mongod restart
ou peut-être que quelqu'un a ajouté avec succès les lignes ci-dessus pour initier le script dans Ubuntu 14.04?
Après avoir lu un peu dans le journal d’avertissement, j’ai ajouté ces deux lignes dans /etc/sysfs.conf
y voilá
kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never
Redémarrez l'ordinateur après avoir appliqué ces modifications.
Comme nous déployons des machines avec Ansible, je n’aime pas modifier les fichiers rc.
J'ai essayé d'utiliser sysfsutils
/sysfs.conf
mais des problèmes de minutage se sont produits lors du démarrage des services sur des machines rapides (ou lentes). Il semblait que parfois mongod avait commencé avant sysfsutils. Parfois cela fonctionnait, parfois non.
Étant donné que mongod est un processus rapide, j'ai trouvé que la solution la plus propre était d'ajouter le fichier /etc/mongo_vm_settings.conf
avec le contenu suivant:
# 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
Cela lancera le script juste avant que mongod ne soit lancé. Redémarrez Mongod (Sudo service mongod restart
) et c'est fait.