Comment éviter l'avertissement transparent_hugepage / defrag de mongodb?

96

Je reçois l'avertissement suivant de mongodb à propos du THP

2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

Mais j'ai réussi à désactiver le THP manuellement

frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
frederick@UbuntuVirtual:~$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

Je l' ai fait l'affaire en ajoutant transparent_hugepage=neverà GRUB_CMDLINE_LINUX_DEFAULTen /etc/default/grubet en ajoutant

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

à /etc/rc.local

Comment diable puis-je éviter l'avertissement?

Frederick Zhang
la source
2
J'ai eu le même problème, mais j'ai oublié de tout redémarrer, y compris mongod. Je sais que c'est peut-être une question stupide, mais avez-vous tout redémarré?
Skooppa.com
1
attendez ... vous vouliez redémarrer le service mongod? oh ... j'ai couru sudo service mongod restartet l'avertissement est parti! Merci! c'est étrange, pourquoi ne puis-je pas simplement redémarrer la VM?
Frederick Zhang
1
Je ne sais pas pourquoi il n'a pas réussi à redémarrer. Mais oui, je voulais dire redémarrer le démon. Heureux que cela fonctionne.
Skooppa.com
7
Ce n'est pas une solution. La raison pour laquelle vous voyez cet avertissement après le redémarrage est que le démon mongo est lancé avant que votre rc.local ne soit exécuté. Le redémarrage du démon après le démarrage du système résout le problème, mais la prochaine fois que vous redémarrerez votre machine virtuelle, vous verrez à nouveau ce bel avertissement. Malheureusement, je ne peux pas vous donner la solution car je suis toujours à la recherche.
SileNT
1
@ Frederick888 Même si vous redémarrez la VM? Le redémarrage du service résout l'avertissement juste temporaire. Pour plus de détails, consultez ce numéro: jira.mongodb.org/browse/SERVER-17418
SileNT

Réponses:

161

La documentation officielle de MongoDB propose plusieurs solutions à ce problème. Vous pouvez également essayer cette solution , qui a fonctionné pour moi:

Remarque: essayez les directives de documentation officielles si la version MongoDB est supérieure à 3.0

  1. Ouvrez le /etc/init.d/mongodfichier.
    (si aucun fichier de ce type, vous pouvez vérifier /etc/init.d/mongod, /etc/init/mongod.conffichiers - crédit: les commentaires ci-dessous)

  2. Ajoutez les lignes ci-dessous immédiatement après chown $DAEMONUSER /var/run/mongodb.pidet avant end script.

  3. Redémarrez mongod( service mongod restart).

Voici les lignes à ajouter /etc/init.d/mongod:

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

C'est tout!

efkan
la source
Désolé de ne pas avoir accepté votre réponse immédiatement. J'ai commenté les lignes que j'ai ajoutées à rc.local et j'ai essayé votre solution, et cela a fonctionné pour moi aussi. Merci!
Frederick Zhang
6
Eh bien, je n'ai pas trouvé de fichier /etc/init/mongod.conf, mais j'ai ajouté ces lignes dans le fichier de script /etc/init.d/mongod, juste avant la ligne echo "Starting ...", et il travaille pour moi
Sagi Mann
2
solution géniale! fonctionne sur Ubuntu 14.04 et mongod 3.
annulé
1
Cela fonctionne, veuillez ajouter une entrée alternative pour /etc/init/mongod.conf pour les utilisateurs d'Ubuntu. gracias.
Jason Sebring
J'utilise mongodb sur ubuntu où mon fichier conf est au format YAML. Y a-t-il une solution alternative applicable là aussi?
Pravesh Jain
10

Pour Ubuntu 14.04 utilisant upstart:

Puisque nous déployons des machines avec Ansible, je n'aime pas modifier les fichiers rc ou les configurations GRUB.

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 était lancé avant sysfsutils. Parfois cela fonctionnait, parfois non.

Puisque mongod est un processus parvenu, j'ai trouvé que la solution la plus propre était d'ajouter le fichier /etc/init/mongod_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 exécutera le script juste avant le démarrage de mongod. Redémarrez mongod ( sudo service mongod restart) et c'est fait.

Whyhankee
la source
8
  1. Ouvrez / etc / default / grub

    sudo vi / etc / default / grub

  2. Mettez à jour
    GRUB_CMDLINE_LINUX_DEFAULT = "" vers GRUB_CMDLINE_LINUX_DEFAULT = "transparent_hugepage = never"

  3. Enregistrer le fichier
    : wq (dans vi)
  4. Exécutez update-grub

    sudo update-grub

  5. Redémarrer la machine

Mise à jour: Si vous utilisez un fournisseur d'hébergement virtuel, cela fonctionnera IFF grub boot est pris en charge. DigitalOcean NE prend PAS en charge le démarrage grub.

clrho
la source
1
Cela ne fonctionne pas pour moi ... (Oui, j'ai ma propre machine Linux, avec grub boot) ... :(
Pierpaolo Cira
1
Notez que si vous utilisez certaines des solutions mentionnées ici, sur un système qui exécute également `` tuned '', tuned peut remplacer ces solutions. Voir ici pour plus d'informations: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton
5

Vérifié que la défragmentation est examinée sans tenir compte de l'activation:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
$ service mongod start
... (in log) WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'
$ echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
$ service mongod stop
$ service mongod start
... (no warning in log)

Par conséquent, le correctif de ce bogue est de regarder d'abord transparent_hugepage / enabled, et si ce n'est jamais le cas, ne vous embêtez pas à regarder le paramètre transparent_hugepage / defrag non pertinent.

Source .

Michael Horojanski
la source
Travaillant sous Oracle Linux 7, la défragmentation n'est jamais partie après les changements recommandés .. enfin un grand soupir de soulagement !! cette réponse a besoin de plus de votes positifs !! J'ai passé 4 heures à creuser ça.
Gnana
4

Ubuntu 16.04 utilisant systemd:

systemctl edit mongod

Collez ce qui suit:

[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"
casser
la source
1
travaillé pour Centos 7 dans /usr/lib/systemd/system/mongod.service aussi
shortsteps