wyłącz przezroczyste strony

63

Instalujemy SAP HANA na maszynie RAID . W ramach etapu instalacji wspomina się, że:

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

Czy zamiast runtime, jeśli chciałbym, aby była to trwała zmiana, czy powinienem dodać powyższą linię do /proc/vmstatpliku?

Ramesh
źródło
2
Pamiętaj, że jeśli używasz niektórych z wymienionych tutaj rozwiązań, w systemie, który również działa w trybie „tuning”, tuning może zastąpić te rozwiązania. Zobacz tutaj, aby uzyskać więcej informacji: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Odpowiedzi:

80

Aby takie opcje stały się trwałe, zazwyczaj dodajesz je do pliku /etc/sysctl.conf. Możesz zobaczyć pełną listę opcji dostępnych za pomocą tego polecenia:

$ sysctl -a

Przykład

$ 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

Możesz poszukać hugepagew danych wyjściowych w następujący sposób:

$ 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

Nie ma tam

Jednak patrząc przez wyjście nie widziałem transparent_hugepage. Googlując jeszcze trochę, natknąłem się na tę stronę Oracle, która omawia ten właśnie temat. Strona nosi tytuł: Konfigurowanie HugePages dla Oracle w systemie Linux (x86-64) .

W szczególności na tej stronie wspominają, jak wyłączyć funkcję ukrywania strony .

fragment

Preferowaną metodą wyłączenia Transparent HugePages jest dodanie „transparent_hugepage = never” do linii rozruchowej jądra w pliku „/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

Aby to zadziałało, należy ponownie uruchomić serwer.

Alternatywnie możesz dodać polecenie do swojego /etc/rc.localpliku.

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

Myślę, że wybrałbym drugą opcję, ponieważ pierwsza będzie zagrożona rozbrajaniem podczas aktualizacji z jednego jądra do następnego.

Możesz potwierdzić, że zadziałało z następującą komendą po ponownym uruchomieniu:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
źródło
7
Możesz sprawić, aby pierwsza opcja przetrwała aktualizacje jądra, dodając transparent_hugepage = nigdy do opcji GRUB_CMDLINE_LINUX_DEFAULT w / etc / default / grub w większości dystrybucji.
Rwky,
2
Jeśli wynikiem cat /sys/kernel/mm/transparent_hugepage/enabledjest [always] madvise never, oznacza alwaysto, że jest włączony lub włączony (zwróć uwagę na []nawiasy always
kwadratowe
4
Nie należy mylić stron tytułowych i stron przezroczystych. Ta ostatnia może powodować wiele problemów, głównie wysokie zużycie procesora podczas ciągłej defragmentacji pamięci i konwertowania normalnych stron 4kB na ogromne 2MB strony.
Marki555,
2
@Rwky - podczas poprawiania zgodnie z twoją sugestią - chciałbym podkreślić, że następną czynnością po zapisaniu pliku jest wykonanie, sudo update-grubaby uzyskać nowe ustawienia „zapisane w kamieniu”. +1 za wskazanie linii pliku grub.
Faron,
2
Aktualizacja dla tych w EC2, cloudimg dodaje plik /etc/default/grub.d/50-cloudimg-settings.cfg, który zastępuje ustawienia w / etc / default / grub i dodaje plik /etc/default/grub.d/ 99-transparent-hugepage.cfg z zawartością GRUB_CMDLINE_LINUX_DEFAULT = „$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = nigdy” rozwiąże ten problem.
Rwky,
13

Chciałem tylko dodać do tego pytania, ponieważ próbowałem wyłączyć przezroczyste strony testowe na CentOS v6, aby włączyć TokuDB dla MariaDB. Dodałem skrypt wymieniony przez @slm /etc/rc.locali wyłączał on przezroczyste strony testowe. Jednak ze względu na sposób działania skryptów startowych w systemie Linux /etc/rc.localjest uruchamiany po uruchomieniu wszystkich usług. Dlatego przezroczyste ogromne strony zostały wyłączone po uruchomieniu MariaDB, a silnik TokuDB nie zainicjował się. Jedynym innym sposobem wyłączenia przezroczystych stronicowania jest dodanie transparent_hugepage=neverparametru jądra.

Zauważyłem komentarz @ 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.i dowiedziałem się, że CentOS nie obsługuje /etc/default/grubpliku i martwiłem się, że transparent_hugepage=neverzniknie on z parametrów jądra podczas jego aktualizacji. Ale nie martw się, CentOS jest tak skonfigurowany, aby zachowywał wszelkie zmiany parametrów jądra w grub, więc po aktualizacji są one zachowywane.

Aby dodać, właściwym sposobem modyfikowania parametrów jądra dla grub jest grubby. Stworzyłem ten prosty skrypt, aby dodać transparent_hugepage=neverdo każdego jądra za pomocą 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
źródło
W przypadku opcji takiej jak ta prawdopodobnie nadal spróbuję dodać ją do /, etc/sysctl.confponieważ będzie ona konsekwentnie stosowana do każdego jądra, które kiedykolwiek może być zainstalowane na pudełku.
slm
Chciałem tylko dodać, że jeśli zmodyfikujesz plik <code> / etc / default / grub </code>, musisz uruchomić grub-mkconfigjako „root”, aby wygenerować rzeczywisty plik konfiguracyjny dla grub.
seattlegaucho
3
W przypadku instancji ubuntu EC2 muszę zmodyfikować /etc/default/grub.d/50-cloudimg-settings.cfgplik zamiast, /etc/default/grubaby działał.
zhengyue,
Korzystam z CentOS 6.6. Zmodyfikowałem, /etc/rc.localale to nie działa dla mnie. Czy możesz mi wyjaśnić podstawową sprawę.
Sandeep Singh,
@ s.singh Jak już powiedziałem /etc/rc.local is executed after all the services are started, należy go wyłączyć na poziomie jądra
ub3rst4r
6

Oto implementacja wykorzystująca marionetkę:

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
źródło
6

Wszystkie powyższe nie działały dla mnie na EC2 Ubuntu 16.04, ale to działało:

sudo apt install hugepages
sudo hugeadm --thp-never
legel
źródło
4

Ponieważ linia kernel transparent_hugepage=neverwyłącza połowę tego, co muszę, (zarówno dla uciążliwego MongoDB upadającego / kłody) tylko, że nie utrzymują się przez systemdskryptu startowego, ale teraz mamy: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Działa to albo w skrypcie rozruchowym systemctl (jeśli jest odpowiednio skonfigurowany /etc/systemd/system), albo bezpośrednio z cli w obecnej postaci.

Rob Jens
źródło
Czy mógłbyś rozszerzyć swoje instrukcje, aby zawierały również „poprawnie skonfigurowany skrypt” i kroki, jak skonfigurować wszystko? Oficjalne instrukcje MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages pokazują stary sposób, a teraz, gdy systemd jest bardziej powszechny, fajnie byłoby mieć to w systematyczny sposób.
ssasa
3

W przypadku Redis emituje również ostrzeżenie, które sugeruje wyłączenie THP. Ale jak zauważono w raporcie o błędzie , na wielu dystrybucjach /etc/rc.localjest wykonywana po usługach i nie ma na nich wpływu, dopóki nie zostaną ponownie uruchomione. Należy również pamiętać, że w środowiskach zwirtualizowanych (np. Digitalocean) nie można kontrolować ustawień GRUB-a.

Rozwiązaniem w takim przypadku jest użycie dedykowanego skryptu inicjującego, aby wyłączyć przezroczyste ogromne strony, jak sugeruje ta strona , według ustawień X-Start-Before. Na przykład skrypt inicjujący Debiana dla 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
źródło
Dokładnie tego szukałem.
nelaaro,
2

Dzięki github i PyYoshi
znalazłem ten przykład dla systemd

Utwórz plik

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

Umieść to w pliku usługi

[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

Dla użytkowników 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

Następnie włącz usługę

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
nelaaro
źródło
1

Jeśli napotkasz problem

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

nawet z sudo, wypróbuj poniższe polecenia:

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
źródło
Cześć, witamy na Unix SE! Zauważ, że byłoby znacznie lepiej, gdybyś również wyjaśnił, co robią twoje polecenia.
user259412
1

Oto szybki hack dla Ansible (nie chcę zarządzać szablonem /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
źródło
0

W SLES11 SP3 z bootloaderem YAST i GRUB-a musimy dodać transparent_hugepage=never[linię edycji bootloadera-YAST z opcjonalnym parametrem jądra]. UWAGA: To narzędzie zmienia plik /boot/grub/menu.lst.

Dopiero po wprowadzeniu tej zmiany i ponownym uruchomieniu nastąpiło wyłączenie THP.

Detlef
źródło