deaktiviere transparente riesige Seiten

63

Wir installieren SAP HANA in einem RAID- Rechner. Im Rahmen des Installationsschritts wird erwähnt, dass

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

Wenn ich also anstelle der Laufzeit eine dauerhafte Änderung vornehmen möchte, sollte ich die obige Zeile in die /proc/vmstatDatei einfügen?

Ramesh
quelle
2
Beachten Sie, dass bei Verwendung einiger der hier genannten Lösungen auf einem System, auf dem auch "optimiert" ausgeführt wird, diese Lösungen möglicherweise überschrieben werden. Weitere Informationen finden Sie hier: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Antworten:

80

Um Optionen wie diese permanent zu machen, fügen Sie sie normalerweise der Datei hinzu /etc/sysctl.conf. Mit diesem Befehl können Sie eine vollständige Liste der verfügbaren Optionen anzeigen:

$ sysctl -a

Beispiel

$ 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

Sie können hugepagein der Ausgabe folgendermaßen suchen :

$ 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

Es ist nicht da?

Allerdings habe ich beim Durchsehen der Ausgabe nichts gesehen transparent_hugepage. Ein bisschen mehr googeln Ich bin auf diese Oracle-Seite gestoßen, die genau dieses Thema behandelt. Die Seite trägt den Titel: Konfigurieren von HugePages für Oracle unter Linux (x86-64) .

Speziell auf dieser Seite wird erwähnt, wie die Funktion für riesige Seiten deaktiviert werden kann .

Auszug

Die bevorzugte Methode zum Deaktivieren von Transparent HugePages ist das Hinzufügen von "transparent_hugepage = never" zur Kernel-Boot-Zeile in der Datei "/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

Der Server muss neu gestartet werden, damit dies wirksam wird.

Alternativ können Sie den Befehl zu Ihrer /etc/rc.localDatei hinzufügen .

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

Ich denke, ich würde mit der 2. Option gehen, da die erste Gefahr besteht, dass sie beim Upgrade von einem Kernel auf den nächsten nicht mehr aktiviert wird.

Sie können bestätigen, dass es mit dem folgenden Befehl nach dem Neustart funktioniert hat:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
quelle
7
Sie können dafür sorgen, dass die erste Option Kernel-Updates überlebt, indem Sie transparent_hugepage = never zur Option GRUB_CMDLINE_LINUX_DEFAULT in / etc / default / grub der meisten Distributionen hinzufügen.
Rwky
2
Wenn die Ausgabe von cat /sys/kernel/mm/transparent_hugepage/enabledist [always] madvise never, dann ist der Status alwaysoder, dass es aktiviert ist (beachten Sie die []Klammern um always)
ub3rst4r
4
Verwechseln Sie keine riesigen Seiten und transparenten riesigen Seiten. Letzteres kann viele Probleme verursachen, insbesondere eine hohe CPU-Auslastung, während ständig versucht wird, den Speicher zu defragmentieren und normale 4-KB-Seiten in riesige 2-MB-Seiten zu konvertieren.
Marki555,
2
@Rwky - Wenn Sie nach Ihrem Vorschlag optimieren, möchte ich betonen, dass die nächste Aktion nach dem Speichern der Datei die Ausführung ist sudo update-grub, um die neuen Einstellungen "in Stein gemeißelt" zu erhalten. +1 für das Zeigen der Grub-Dateizeile.
Faron
2
Als Update für EC2-Benutzer fügt cloudimg die Datei /etc/default/grub.d/50-cloudimg-settings.cfg hinzu, die die Einstellungen in / etc / default / grub überschreibt und eine Datei /etc/default/grub.d/ hinzufügt. 99-transparent-hugepage.cfg mit dem Inhalt GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never" löst dieses Problem.
Rwky
13

Ich wollte diese Frage nur ergänzen, als ich versuchte, transparente riesige Seiten unter CentOS v6 zu deaktivieren, um TokuDB für MariaDB zu aktivieren. Ich habe das von @slm erwähnte Skript hinzugefügt /etc/rc.localund transparente Riesen-Seiten deaktiviert. Aufgrund der Funktionsweise von Startskripten unter Linux wird sie /etc/rc.localjedoch ausgeführt, nachdem alle Dienste gestartet wurden. Aus diesem Grund wurden transparente große Seiten deaktiviert, nachdem MariaDB bereits gestartet wurde und die TokuDB-Engine nicht initialisiert wurde. Die einzige andere Möglichkeit, transparente Riesen-Seiten zu deaktivieren, ist das Hinzufügen transparent_hugepage=neverzum Kernel-Parameter.

Ich bemerkte @ Rwkys Kommentar 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.und stellte fest, dass CentOS die /etc/default/grubDatei nicht unterstützt und war besorgt, transparent_hugepage=neverdass sie bei der Aktualisierung aus den Kernel-Parametern verschwindet. Aber keine Sorge, CentOS ist so eingerichtet, dass Änderungen an den Kernelparametern in grub beibehalten werden, sodass sie bei einer Aktualisierung beibehalten werden.

Außerdem können Sie die Kernel-Parameter für grub wie folgt ändern grubby: Ich habe dieses einfache Skript erstellt, um transparent_hugepage=neveres jedem Kernel hinzuzufügen 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
quelle
Für eine Option wie diese würde ich wahrscheinlich immer noch versuchen, sie zu / hinzuzufügen, etc/sysctl.confda dies konsistent auf jeden Kernel angewendet wird, der jemals auf der Box installiert wurde.
slm
Ich wollte nur hinzufügen, dass Sie, wenn Sie die Datei <code> / etc / default / grub </ code> ändern, grub-mkconfigals 'root' ausführen müssen , um die eigentliche Konfigurationsdatei für grub zu generieren.
Seattlegaucho
3
Für eine EC2-Ubuntu-Instanz muss ich die /etc/default/grub.d/50-cloudimg-settings.cfgDatei ändern , anstatt sie zum Laufen /etc/default/grubzu bringen.
Zhengyue
Ich benutze CentOS 6.6. Ich habe geändert, /etc/rc.localaber es funktioniert nicht für mich. Kannst du mir bitte den Grundfall erklären?
Sandeep Singh
@ s.singh Wie ich schon sagte /etc/rc.local is executed after all the services are started, muss es auf der Kernel-Ebene deaktiviert werden
ub3rst4r
6

Hier ist eine Implementierung mit Puppet:

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
quelle
6

All das funktionierte bei mir auf einem EC2 Ubuntu 16.04 nicht, aber das tat es:

sudo apt install hugepages
sudo hugeadm --thp-never
legel
quelle
4

Da die Kernel - Zeile transparent_hugepage=neverdeaktiviert nur die Hälfte von dem, was ich brauche (beide für lästige mongodb versagt / logs), dass ich nicht durchgekommen beharren systemdStartskript aber jetzt hat: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Das funktioniert entweder im systemctl-Boot-Skript (wenn es richtig konfiguriert ist /etc/systemd/system) oder direkt von der Client-Konsole aus.

Rob Jens
quelle
Könnten Sie bitte Ihre Anweisungen erweitern, um auch das "richtig konfigurierte Skript" und Schritte zum Einrichten von allem aufzunehmen? Die offiziellen MongoDB-Anweisungen docs.mongodb.org/manual/tutorial/transparent-huge-pages zeigen den alten Weg, während jetzt, da systemd üblicher ist, es schön wäre, dies auf systemd-Weise zu haben.
ssasa
3

Im Falle von Redis wird auch eine Warnung ausgegeben, die vorschlägt, THP zu deaktivieren. Aber wie im Fehlerbericht erwähnt , wird auf vielen Distributionen /etc/rc.localAfter-Services ausgeführt und es hat keine Auswirkung auf sie, bis sie neu gestartet werden . Beachten Sie auch, dass Sie in virtualisierten Umgebungen (z. B. Digitalocean) die GRUB-Einstellungen nicht steuern können.

Die Lösung in einem solchen Fall ist die Verwendung eines dedizierten Init- Skripts, um transparente große Seiten, wie auf dieser Seite vorgeschlagen , durch Einstellungen zu deaktivieren X-Start-Before. Zum Beispiel Debian- Init- Skript für 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
quelle
Genau das, wonach ich gesucht habe.
Nelaaro
2

Dank github & PyYoshi habe
ich dieses Beispiel für systemd gefunden

Erstellen Sie die Datei

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

Fügen Sie dies in die Servicedatei ein

[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

Für Debian / Ubuntu-Benutzer

[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

Aktivieren Sie dann den Dienst

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
Nelaaro
quelle
1

Wenn du auf das Problem stößt

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

Probieren Sie auch mit sudo die folgenden Befehle aus:

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
quelle
Hallo, willkommen auf der Unix SE! Beachten Sie, es wäre viel besser, wenn Sie auch erklären würden, was Ihre Befehle tun.
User259412
1

Hier ist ein kurzer Hack für Ansible (für den ich keine Vorlage verwalten möchte /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
quelle
0

In SLES11 SP3 mit YAST- und GRUB-Bootloader müssen wir transparent_hugepage=never[YAST-Bootloader-Bearbeitungszeile mit optionalem Kernel-Parameter] hinzufügen . HINWEIS: Dieses Tool ändert die Datei /boot/grub/menu.lst.

Erst nach dieser Änderung und einem Neustart wurde THP deaktiviert.

Detlef
quelle