désactiver les gigantesques pages transparentes

63

Nous installons SAP HANA sur une machine RAID . Dans le cadre de l’étape de l’installation, il est mentionné que,

 To disable the usage of transparent hugepages set the kernel settings 
 at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled 

Ainsi, au lieu de l'exécution, si je voulais en faire une modification permanente, devrais-je ajouter la ligne ci-dessus à l'intérieur du /proc/vmstatfichier?

Ramesh
la source
2
Notez que si vous utilisez certaines des solutions mentionnées ici, sur un système qui s'exécute également «optimisé», optimisé peut remplacer ces solutions. Voir ici pour plus d'informations: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Réponses:

80

Pour rendre des options telles que ce permanent, vous les ajouterez généralement au fichier /etc/sysctl.conf. Vous pouvez voir une liste complète des options disponibles en utilisant cette commande:

$ sysctl -a

Exemple

$ sudo sysctl -a | head -5
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 6000000
kernel.sched_latency_ns = 18000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_shares_ratelimit = 750000

Vous pouvez chercher hugepagedans la sortie comme ceci:

$ sudo sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0

Ce n'est pas là?

Cependant, en regardant à travers la sortie, je n'ai pas vu transparent_hugepage. Googling un peu plus, je suis tombé sur cette page Oracle qui traite de ce sujet même. La page s'intitule: Configuration d'HugePages pour Oracle sous Linux (x86-64) .

Spécifiquement sur cette page, ils expliquent comment désactiver la fonction énorme page .

extrait

La méthode recommandée pour désactiver Transparent HugePages consiste à ajouter "transparent_hugepage = never" à la ligne de démarrage du noyau dans le fichier "/etc/grub.conf".

   title Oracle Linux Server (2.6.39-400.24.1.el6uek.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.39-400.24.1.el6uek.x86_64 ro root=/dev/mapper/vg_ol6112-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=uk
    LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  rd_NO_DM rd_LVM_LV=vg_ol6112/lv_swap rd_LVM_LV=vg_ol6112/lv_root rhgb quiet numa=off
    transparent_hugepage=never
            initrd /initramfs-2.6.39-400.24.1.el6uek.x86_64.img

Le serveur doit être redémarré pour que cela prenne effet.

Sinon, vous pouvez ajouter la commande à votre /etc/rc.localfichier.

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

Je pense que je choisirais la deuxième option, car la première risquerait de se perdre lors de la mise à niveau d’un noyau à l’autre.

Vous pouvez confirmer que cela a fonctionné avec la commande suivante après le redémarrage:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
la source
7
Vous pouvez faire en sorte que la première option survive aux mises à jour du noyau en ajoutant transparent_hugepage = never à l'option GRUB_CMDLINE_LINUX_DEFAULT dans / etc / default / grub de la plupart des distributions.
Rwky
2
Si la sortie de cat /sys/kernel/mm/transparent_hugepage/enabledest [always] madvise never, alors le statut est alwaysou il est activé (notez les []crochets autour always)
ub3rst4r
4
Ne confondez pas énormes pages et énormes pages transparentes. Cette dernière peut causer de nombreux problèmes, principalement une utilisation intensive du processeur, tout en essayant en permanence de défragmenter la mémoire et de convertir des pages de 4 ko normales en énormes pages de 2 Mo.
Marki555
2
@ RWK - lorsque vous modifiez selon votre suggestion - je soulignerais que l'action suivante après la sauvegarde du fichier consiste à exécuter sudo update-grubpour obtenir les nouveaux paramètres "gravés dans la pierre". +1 pour pointer la ligne du fichier grub.
Faron
2
Une mise à jour pour ceux sur EC2, cloudimg ajoute le fichier /etc/default/grub.d/50-cloudimg-settings.cfg qui remplace les paramètres de / etc / default / grub en ajoutant un fichier /etc/default/grub.d/. 99-transparent-hugepage.cfg avec le contenu GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never" va résoudre ce problème.
Rwky
13

Je voulais juste ajouter quelque chose à cette question, car j'essayais de désactiver les énormes pages transparentes sur CentOS v6 afin d'activer TokuDB pour MariaDB. J'ai ajouté le script mentionné par @slm /etc/rc.localet désactivé les gigantesques pages transparentes. Cependant, en raison de la manière dont les scripts de démarrage fonctionnent sous Linux, ils /etc/rc.localsont exécutés après le démarrage de tous les services. Par conséquent, des pages volumineuses transparentes étaient en cours de désactivation après le démarrage de MariaDB et l'initialisation du moteur TokuDB. La seule autre façon de désactiver les pages géantes transparentes consiste à ajouter un transparent_hugepage=neverparamètre au noyau.

J'ai remarqué le commentaire de @ Rwky You can make the first option survive kernel updates by adding transparent_hugepage=never to the GRUB_CMDLINE_LINUX_DEFAULT option in /etc/default/grub on most distributions.et découvert que CentOS ne prend pas en charge le /etc/default/grubfichier et craignais de transparent_hugepage=neverdisparaître des paramètres du noyau lors de la mise à jour. Mais ne vous inquiétez pas, CentOS est configuré pour conserver toutes les modifications apportées aux paramètres du noyau dans grub afin qu’elles soient conservées lors de la mise à jour.

Pour ajouter également, la méthode appropriée pour modifier les paramètres du noyau pour grub consiste à utiliser grubby. J'ai créé ce script simple à ajouter transparent_hugepage=neverà chaque noyau avec grubby:

#!/bin/sh

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

for KERNEL in /boot/vmlinuz-*; do
    grubby --update-kernel="$KERNEL" --args='transparent_hugepage=never'
done
ub3rst4r
la source
Pour une option telle que celle-ci, j'essaierais probablement encore de l'ajouter à / etc/sysctl.confcar cela sera systématiquement appliqué à tout noyau pouvant être installé sur la boîte.
slm
Je voulais simplement ajouter que si vous modifiez le fichier <code> / etc / default / grub </ code>, vous devez l'exécuter en grub-mkconfigtant que "root" pour générer le fichier de configuration actuel de grub.
seattlegaucho
3
Pour une instance EC2 ubuntu, je dois modifier le /etc/default/grub.d/50-cloudimg-settings.cfgfichier au lieu de le /etc/default/grubpour le faire fonctionner.
Zhengyue
J'utilise CentOS 6.6. J'ai modifié /etc/rc.localmais cela ne fonctionne pas pour moi. Pouvez-vous s'il vous plaît expliquer le cas racine à moi.
Sandeep Singh
@ s.singh Comme je l'ai dit /etc/rc.local is executed after all the services are started, il doit être désactivé au niveau du noyau
ub3rst4r
6

Voici une implémentation utilisant marionnette:

exec { "disable_transparent_hugepage_enabled":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/enabled 2>/dev/null",
}

exec { "disable_transparent_hugepage_defrag":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/defrag 2>/dev/null",
}
J Maurer
la source
6

Tout ce qui précède n'a pas fonctionné pour moi sur un EC2 Ubuntu 16.04, mais cela a fonctionné:

sudo apt install hugepages
sudo hugeadm --thp-never
legel
la source
4

Depuis la ligne du noyau transparent_hugepage=neverdésactive seulement la moitié de ce que je dois ( les deux, pour MongoDB ennuyeux défaut / logs), que je ne persistait pas dans le systemdscript de démarrage , mais désormais: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Cela fonctionne dans le script de démarrage systemctl (s'il est correctement configuré /etc/systemd/system) ou directement à partir de la CLI en l'état.

Rob Jens
la source
Pourriez-vous s'il vous plaît développer vos instructions pour inclure également le "script correctement configuré" et les étapes pour tout configurer? Les instructions officielles de MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages montrent l'ancienne méthode, alors que maintenant systemd est plus répandu, il serait bien de l'avoir de manière systématique.
Ssasa
3

En cas de Redis, il émet également un avertissement suggérant de désactiver THP. Mais comme indiqué dans le rapport de bogue , de nombreuses distributions /etc/rc.localsont exécutées après les services et n’ont aucun effet sur elles jusqu’à ce qu’elles redémarrent. Notez également que dans les environnements virtualisés (par exemple, Digitalocean), vous ne pouvez pas contrôler les paramètres GRUB.

Dans ce cas, la solution consiste à utiliser un script d’ initialisation dédié pour désactiver les grandes pages transparentes, comme le suggère cette page , par paramètres X-Start-Before. Par exemple, le script d' initialisation Debian pour Redis:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-thp
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    redis-server
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable THP
# Description:       disables Transparent Huge Pages (THP) on boot
### END INIT INFO

case $1 in
start)
  if [ -d /sys/kernel/mm/transparent_hugepage ]; then
    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
  else
    return 0
  fi
;;
esac 
saaj
la source
Exactement ce que je cherchais.
Nelaaro
2

Merci à github & PyYoshi,
j'ai trouvé cet exemple pour systemd

Créer le fichier

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service

Mettez ceci dans le fichier de service

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Pour les utilisateurs debian / ubuntu

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Puis activer le service

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
Nelaaro
la source
1

Si vous rencontrez le problème

-bash: /sys/kernel/mm/transparent_hugepage/khugepaged/defrag: Permission denied

même avec sudo, essayez les commandes ci-dessous:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
Qiang Du
la source
Bonjour, bienvenue sur Unix SE! Remarque, il serait beaucoup mieux que vous expliquiez également ce que font vos commandes.
user259412
1

Voici un petit hack pour Ansible (je ne veux pas gérer un modèle pour /etc/rc.local):

- name: Disable Transparent Huge Pages at boot
  lineinfile:
    dest: /etc/rc.local
    line: "if [ -d /sys/kernel/mm/transparent_hugepage ]; then echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled ; echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag ; fi"
  register: transparent_hugepage
- name: Disable disabled rc.local
  lineinfile:
    dest: /etc/rc.local
    line: 'exit 0'
    state: absent
- name: Disable Transparent Huge Pages at run time 1/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/defrag
  when: transparent_hugepage|changed
- name: Disable Transparent Huge Pages at run time 2/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/enabled
  when: transparent_hugepage|changed
Dannyman
la source
0

Dans SLES11 SP3 avec le chargeur de démarrage YAST et GRUB, nous devons ajouter transparent_hugepage=never[YAST-bootloader-edit-line avec le paramètre de noyau facultatif]. REMARQUE: cet outil modifie le fichier /boot/grub/menu.lst.

Ce n’est qu’après avoir effectué ce changement que le redémarrage a entraîné la désactivation de THP.

Detlef
la source