Comment modifier "/ sys / kernel / mm / transparent_hugepage / enabled"

42

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 façon permanente?

    
posée Feng Yu 16.03.2015 - 10:24
la source

7 réponses

52

Vous pouvez

  1. installez le package sysfsutils :

    sudo apt install sysfsutils
    
  2. et ajoutez une ligne avec ce paramètre à /etc/sysfs.conf :

    kernel/mm/transparent_hugepage/enabled = never
    

Il s’agit de la solution la plus propre car elle permet de conserver toute la configuration de 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 exécutée sur la machine concernée.

    
réponse donnée David Foerster 18.04.2015 - 04:42
la source
23

Les documents MongoDB ont quelques suggestions. lien

La méthode "préférée" consiste à modifier /etc/default/grub et à ajouter transparent_hugepage=never à GRUB_CMDLINE_LINUX_DEFAULT , puis à exécuter update-grub pour reconstruire la configuration GRUB.

Le double-liner suivant fera exactement cela. Assurez-vous de vérifier la sortie!

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 entrera les entrées dans /etc/default/grub avec celles de /etc/default/grub.d/* . Si par hasard vous exécutez sur AWS, vous devrez plutôt modifier /etc/default/grub.d/50-cloudimg-settings.cfg .

La méthode "alternative" consiste à modifier /etc/rc.local et à ajouter les éléments suivants 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 faire les deux méthodes "préférées" et "alternatives", car elles ne s'excluent pas mutuellement et élimine l'avertissement de défragmentation.

* Travaillé pour moi sur Ubuntu 14.04, MongoDB 3.0.2 et AWS.

    
réponse donnée clayzermk1 11.04.2015 - 00:08
la source
14

Voici une solution qui a été testée pour fonctionner sur Ubuntu 16.04 sur AWS EC2. Ubuntu 16.04 utilise le système d'initialisation systemd, 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 au démarrage de MongoDB

systemctl enable mongodb-hugepage-fix

Si vous voulez activer les modifications immédiatement (avant le prochain démarrage)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Cette solution est non adaptée à Ubuntu 14.04, qui utilise la solution d’initialisation Upstart au lieu de systemd.

    
réponse donnée Mark Stosberg 02.09.2016 - 19:07
la source
7

Ajoutez les lignes suivantes 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 s’exécutera lorsque vous redémarrez le serveur.

    
réponse donnée PKumar 16.03.2015 - 10:50
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.conf mais 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 était lancé avant sysfsutils. Parfois ça marchait, parfois ça ne marchait pas.

Puisque mongod est un processus de démarrage, j'ai trouvé que la solution la plus propre consistait à 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 exécutera le script juste avant le démarrage de mongod. Redémarrez mongod ( sudo service mongod restart ) et terminé.

    
réponse donnée Whyhankee 27.06.2016 - 13:39
la source
0

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.

    
réponse donnée Ulv3r 17.11.2017 - 19:18
la source
-1

GRUB changera après la mise à jour et rc.local ne fonctionnera qu'après le démarrage de mongo, alors peut-être devrions-nous ajouter service mongo restart à la fin de rc.local comme ceci

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

wait 1 && servie mongod restart

ou peut-être quelqu'un a-t-il ajouté les lignes ci-dessus au script d'initialisation dans Ubuntu 14.04?

    
réponse donnée Edik Mkoyan 11.11.2015 - 12:33
la source

Lire d'autres questions sur les étiquettes