web-dev-qa-db-fra.com

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

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?

50
Feng Yu

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
    

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.

66
David Foerster

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.

24
clayzermk1

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.

16
Mark Stosberg

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.

7
PKumar

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?

0
Edik Mkoyan

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.

0
Ulv3r

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.

0
Whyhankee