Comment modifier «/ sys / kernel / mm / transparent_hugepage / enabled»

50

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 puis-je modifier en /sys/kernel/mm/transparent_hugepage/enabledpermanence?

Feng Yu
la source
1
Vous trouverez peut-être de bonnes réponses ci-dessous, mais l'OMI devrait consulter la documentation officielle de MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl le

Réponses:

70

Vous pouvez

  1. installez le sysfsutilspaquet:

    sudo apt install sysfsutils
    
  2. et ajoutez une ligne avec ce paramètre pour /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, c'est-à-dire si vous n'avez même pas une idée approximative de la version du noyau s'exécutant sur la machine affectée.

David Foerster
la source
4
Cela ne m'a rien apporté sur Ubuntu 14.04 sur une instance AWS EC2. Je ne connais pas grand chose à propos de sysfs.conf, mais il semble que ce soit une configuration prise en charge par Ubuntu, mais le fichier n’existait pas sur notre système auparavant, et son ajout et son redémarrage n’ont aucunement modifié les avertissements de sortie de mongo. J'ai également essayé le conseil de clayzermk1 ci-dessous, l'avertissement 'defrag' apparaissant toujours. Le script d'initialisation mongo docs officiel a effectivement supprimé les deux avertissements.
Neek
Quelle est la sortie de cat /sys/kernel/mm/transparent_hugepage/enabled? Existe-t-il du tout? sysfs.confest normalement évalué au démarrage par /etc/init.d/sysutils. Est-ce activé? Que se passe-t-il quand vous invoquez /etc/init.d/sysutils start?
David Foerster
3
Je n'ai pas non plus de sysfs.conffichier et /etc/init.d/sysutils. Ubuntu 16.04
HEX
1
@unhammer: Non, les deux ont une portée différente. sysctlest destiné aux paramètres que vous pouvez également obtenir avec les paramètres du noyau; sysfs.confest pour les entrées dans /sys.
David Foerster
1
@navossoc: Pourriez-vous s'il vous plaît ouvrir une nouvelle question si vous avez une nouvelle question ou une question de suivi? La section de commentaires ne convient pas aux nouvelles questions ou aux discussions prolongées. Vous pouvez me faire parvenir un commentaire avec une notification pour attirer mon attention. Merci.
David Foerster
25

Les documents MongoDB ont quelques suggestions. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

La façon « préférée » est d'éditer /etc/default/grubet append transparent_hugepage=neverpour GRUB_CMDLINE_LINUX_DEFAULTensuite exécuter update-grubpour reconstruire la configuration de 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-grubc'est un wrapper pour grub-mkconfig. grub-mkconfigclobber entrées /etc/default/grubavec ceux 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 "alternative" consiste à éditer /etc/rc.localet à ajouter les éléments suivants 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.

clayzermk1
la source
J'ai essayé ceci sur mon serveur d'applications MongoDB en un clic sur DigitalOcean et cela n'a pas fonctionné. Toujours recevoir le même message d'avertissement.
Scaryguy
Merci pour la partie sur EC2 et50-cloudimg-settings.cfg
Martin Konecny
16

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.serviceet 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 ne convient pas à Ubuntu 14.04, qui utilise la solution Upstart init à la place de systemd.

Mark Stosberg
la source
1
Le correctif systemd est parfait pour les installations modernes de MongoDB, merci.
Four43
7

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.

PKumar
la source
1
Y at-il un fichier de configuration à ce sujet? rc.localn’est pas une bonne idée, car rc.local sera exécuté à la fin du démarrage du système. Donc, le service mongodb utilisera toujours le paramètre par défaut.
Feng Yu
2
éditez le fichier / etc / default / grub et modifiez la ligne "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "et exécutez la commande update-grub puis redémarrez le serveur
PKumar
2
Merci, ça marche. Mais, existe-t-il une manière similaire de modifier /sys/kernel/mm/transparent_hugepage/defrag? Lorsque je redémarre, le shell mongo me dit également "** AVERTISSEMENT: / sys / kernel / mm / transparent_hugepage / defrag est" toujours "."
Feng Yu
0

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; ensuite
  echo never> / sys / kernel / mm / transparent_hugepage / enabled
Fi

si test -f / sys / kernel / mm / transparent_hugepage / defrag; ensuite
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
Fi

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

Edik Mkoyan
la source
0

Comme nous déployons des machines avec Ansible, je n’aime pas modifier les fichiers rc.

J'ai essayé d'utiliser sysfsutils/ sysfs.confmais j'ai rencontré des problèmes de synchronisation 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.confavec 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.

Whyhankee
la source
Notez que cette solution utilise le système init "Upstart", alors qu'Ubuntu 16.04 est basé sur le système systemd init.
Mark Stosberg
0

Après avoir lu un peu dans le journal d’avertissement, j’ai ajouté ces deux lignes dans /etc/sysfs.confvo voá

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

Redémarrez l'ordinateur après avoir appliqué ces modifications.

Ulv3r
la source
Cela nécessite toujours le sysfsutilspaquet (voir ma réponse).
David Foerster
sûrement il est nécessaire
Ulv3r