Désactiver la défragmentation THP et THP sur l'instance CentOS 7 EC2

9

Je souhaite désactiver transparent_hugepage (THP) sur une instance CentOS 7 EC2, qui est activée par défaut:

# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never
# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

Ce paramètre peut être modifié manuellement:

# echo never > /sys/kernel/mm/transparent_hugepage/enabled
# echo never > /sys/kernel/mm/transparent_hugepage/defrag
# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

... mais les modifications sont perdues après le redémarrage.

J'ai essayé de mettre l' echo never [...]instruction dans mes fichiers rc.localet cloud.cfg, mais cela n'a pas fonctionné.

J'ai également essayé d'ajouter le paramètre transparent_hugepage=neverà la ligne du noyau de /etc/grub.conf(comme expliqué ici ), mais cela n'a pas fonctionné mieux.

Alors ... comment puis-je désactiver THP sur CentOS 7 fonctionnant sur une instance AWS EC2?

edit: changement de titre ... J'ai besoin de désactiver THP et THP defrag

vcarel
la source
Par souci d'intérêt, puis-je vous demander pourquoi vous souhaitez désactiver THP?
Cameron Kerr
Après le redémarrage, votre instasnce ne fonctionnera pas si vous "ajoutez transparent_hugepage = never à la ligne du noyau de /etc/grub.conf" et devrez supprimer cette ligne du fichier grub. À cette fin, nous pouvons attacher une instance existante à une nouvelle et monter la partition dans le dossier
Artem.Borysov

Réponses:

14

La solution est à l' écoute , comme l'a souligné @ michael-hampton. La partie délicate est que le plugin vm ne peut configurer que le /sys/kernel/mm/transparent_hugepage/enabledparamètre.

Pour désactiver également le /sys/kernel/mm/transparent_hugepage/defragparamètre, j'ai dû créer un script appelé par le profil au démarrage.

Au final, la solution complète est:

étape 1 : Créez le répertoire pour contenir le profil personnalisé:

mkdir /etc/tuned/custom

étape 2 : créer le profil /etc/tuned/custom/tuned.conf:

[main]
include=virtual-guest

[vm]
transparent_hugepages=never

[script]
script=script.sh

Notez que ce profil hérite de virtual-guest , qui était mon profil actif, semblant en fait approprié pour le serveur virtualisé (EC2). Vous pouvez afficher votre profil actif avec la commande tuned-adm active. Si vous êtes curieux, vous pouvez consulter le contenu des profils prédéfinis dans/usr/lib/tuned/

étape 3 : Créez le script /etc/tuned/custom/script.sh:

#!/bin/sh

. /usr/lib/tuned/functions

start() {
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    return 0
}

stop() {
    return 0
}

process $@

Rendez-le exécutable:

sudo chmod 755 /etc/tuned/custom/script.sh

étape 4 : Activez le nouveau profil:

tuned-adm profile custom

Vous devriez maintenant obtenir:

# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

Il persistera après le redémarrage.

vcarel
la source
Nous avons constaté que cela fonctionnait sur une machine virtuelle AWS Redhat 7.4. Merci!
Jon Sampson
2

En plus de définir la ligne de commande grub, vous devez également configurer tuned. Mais n'utilisez pas les instructions auxquelles vous avez lié, car elles sont si pleines d'erreurs qu'il faudrait une demi-journée juste pour les expliquer toutes.

Créez un profil personnalisé (que j'appellerai custom), puis définissez le profil. Vous le baserez sur un profil existant, par exemple virtual-guestsi vous exécutez sur une machine virtuelle (EC2 l'est, bien sûr), ou throughput-performancesi vous êtes sur une machine physique.

Créez le répertoire pour contenir le profil personnalisé:

mkdir /etc/tuned/custom

Créez le profil personnalisé /etc/tuned/custom/tuned.conf, par exemple:

[main]
include=virtual-guest

[vm]
transparent_hugepages=never

Définissez maintenant le profil:

tuned-adm profile custom
Michael Hampton
la source
Ces instructions pleines d'erreurs? Il faudrait une demi-journée pour expliquer? Voilà ce que j'essaie de comprendre.
vcarel
Au fait, je ne comprends pas votre réponse. Pourquoi dois-je configurer grub et utiliser complètement tuned?
vcarel
1
Parce qu'il est activé par défaut dans la configuration du noyau et activé par défaut dans la configuration optimisée. Vous devez changer les deux pour qu'il soit complètement efficace.
Michael Hampton
1
Configurer réglé semble suffisant ... Je n'ai pas eu à changer la configuration de grub. BTW, existe-t-il un autre paramètre réglé pour désactiver la défragmentation THP aussi?
vcarel
@vcarel Ce n'est pas nécessaire car les pages géantes transparentes sont déjà désactivées!
Michael Hampton
1

Essayez aussi ceci

nano /etc/init.d/disable-transparent-hugepages

#!/bin/sh
### BEGIN INIT INFO
# Provides:          disable-transparent-hugepages
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    mongod mongodb-mms-automation-agent
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable Linux transparent huge pages
# Description:       Disable Linux transparent huge pages, to improve
#                    database performance.
### END INIT INFO

case $1 in
  start)
    if [ -d /sys/kernel/mm/transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/transparent_hugepage
    elif [ -d /sys/kernel/mm/redhat_transparent_hugepage ]; then
      thp_path=/sys/kernel/mm/redhat_transparent_hugepage
    else
      return 0
    fi

    echo 'never' > ${thp_path}/enabled
    echo 'never' > ${thp_path}/defrag

    unset thp_path
    ;;
esac

sudo chmod 755 /etc/init.d/disable-transparent-hugepages

sudo chkconfig --add disable-transparent-hugepages

Artem.Borysov
la source
0

Vous pouvez éditer le fichier /etc/rc.local et ajouter cette commande suivante à ce fichier:

echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag

et exécutez chmod +x /etc/rc.d/rc.localpour vous assurer que le script sera exécuté au démarrage. testé sur Amazon Linux 2.

Yuda Prawira
la source
-2

EDIT: la réponse ci-dessus est fausse , car les boutons transparents de page énorme sont manquants dans sysctl pour le moment. Désolé pour le bruit.


Vous pouvez saisir les valeurs souhaitées /etc/sysctl.conf.

A partir de la page de manuel sysctl.conf (5):

SYSCTL.CONF (5) Formats de fichiers SYSCTL.CONF (5)

NOM
       sysctl.conf - fichier de préchargement / configuration sysctl

LA DESCRIPTION
       sysctl.conf est un fichier simple contenant des valeurs sysctl à lire et à définir par sysctl. La syntaxe est simplement la suivante:

              # commentaire
              ; commentaire

              jeton = valeur

       Notez que les lignes vides sont ignorées et les espaces avant et après un jeton ou une valeur sont ignorés, bien qu'une valeur puisse contenir des espaces à l'intérieur. Lignes commençant par un # ou; sont considérés
       commentaires et ignoré.

EXEMPLE
              # échantillon sysctl.conf
              #
                kernel.domainname = example.com
              ; celui-ci a un espace qui sera écrit dans le sysctl!
                kernel.modprobe = / sbin / mod sonde
shodanshok
la source
1
Cela ne peut pas être configuré à l'aide de sysctl.
Michael Hampton
Pourquoi? J'ajuste souvent / sys / knowbs en utilisant sysctl.conf ... Il me manque quelque chose ici? EDIT: tant pis, je l'ai trouvé sur la documentation RHEL. Merci de me le
signaler