web-dev-qa-db-fra.com

désactiver les pages géantes transparentes

Nous installons SAP HANA sur une machine RAID . Dans le cadre de l'étape d'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 

Donc, au lieu de l'exécution, si je voulais en faire un changement permanent, dois-je ajouter la ligne ci-dessus à l'intérieur de /proc/vmstat fichier?

65
Ramesh

Pour rendre des options telles que cette permanente, vous les ajouterez généralement au fichier /etc/sysctl.conf. Vous pouvez voir une liste complète des options disponibles à l'aide de 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 rechercher hugepage dans 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. Googler un peu plus Je suis tombé sur cette page Oracle qui traite de ce sujet même. La page est intitulée: Configuration de HugePages pour Oracle sur Linux (x86-64) .

Plus précisément sur cette page, ils mentionnent comment désactiver la fonction énorme page .

extrait

La méthode préféré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.

Vous pouvez également ajouter la commande à votre /etc/rc.local fichier.

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 j'irais avec la 2e option, car la première risque de ne pas être définie lorsque vous passez d'un noyau à l'autre.

Vous pouvez confirmer qu'il a fonctionné avec la commande suivante après le redémarrage:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
81
slm

Je voulais juste ajouter à cette question car j'essayais de désactiver les pages géantes transparentes sur CentOS v6 afin d'activer TokuDB pour MariaDB. J'ai ajouté le script mentionné par @slm à /etc/rc.local et il a désactivé les pages géantes transparentes. Cependant, en raison du fonctionnement des scripts de démarrage sous Linux, /etc/rc.local est exécuté après le démarrage de tous les services. Par conséquent, les pages énormes transparentes étaient désactivées après le démarrage de MariaDB et le moteur TokuDB ne s'initialisait pas. La seule autre façon de désactiver les pages géantes transparentes consiste à ajouter transparent_hugepage=never au paramètre du 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 a découvert que CentOS ne prend pas en charge le /etc/default/grub fichier et s'inquiétait pour transparent_hugepage=never disparaissant des paramètres du noyau lors de sa 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, donc quand il est mis à jour, ils sont conservés.

Pour ajouter également, la bonne façon de modifier les paramètres du noyau pour grub est avec grubby. J'ai créé ce script simple pour 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
13
ub3rst4r

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",
}
6
J Maurer

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

Sudo apt install hugepages
Sudo hugeadm --thp-never
6
legel

Puisque la ligne du noyau transparent_hugepage=never ne désactive que la moitié de ce dont j'ai besoin (les deux, pour les échecs/journaux de mongodb ennuyeux), que je n'ai pas persisté dans le script de démarrage systemd mais que j'ai maintenant: echo never | Sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Cela fonctionne dans l'un ou l'autre des scripts de démarrage systemctl (lorsqu'il est correctement configuré, un dans /etc/systemd/system) ou directement depuis le cli tel quel.

4
Rob Jens

Dans le cas de Redis, il émet également un avertissement qui suggère de désactiver THP. Mais comme indiqué dans le rapport de bogue , sur de nombreuses distributions /etc/rc.local est exécuté après les services et n'a aucun effet sur eux jusqu'à leur redémarrage. Notez également que dans les environnements virtualisés (par exemple Digitalocean), vous ne pouvez pas contrôler les paramètres GRUB.

La solution dans ce cas est d'utiliser un script init dédié pour désactiver les pages énormes transparentes comme cette page suggère, par les paramètres X-Start-Before. Par exemple, le script Debian init 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 
3
saaj

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 de 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

Activez ensuite le service

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
3
nelaaro

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'
1
Qiang Du

Voici un petit hack pour Ansible (je ne veux pas aller 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
1
dannyman

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

Ce n'est qu'après avoir effectué cette modification et redémarré que le THP a été désactivé.

0
Detlef

Voici une autre solution de marionnettes dans la Forge: https://forge.puppetlabs.com/ramseymcgrath/remove_hugepage/

Utilisez simplement:

include remove_hugepage

dans votre définition de nœud de marionnette.

0
Ramsey