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?
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
$ 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
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]
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
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",
}
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
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.
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
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
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'
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
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é.
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.