disabilitare gli hugepage trasparenti


63

Stiamo installando SAP HANA in una macchina RAID . Come parte della fase di installazione, si dice che,

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

Quindi, invece di runtime, se volessi rendere questo un cambiamento permanente, dovrei aggiungere la riga sopra all'interno del /proc/vmstatfile?


2
Si noti che se si utilizzano alcune delle soluzioni menzionate qui, su un sistema che esegue anche "sintonizzato", sintonizzato potrebbe ignorare tali soluzioni. Vedi qui per maggiori informazioni: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Risposte:


80

Per rendere opzioni come questo permanente, in genere le aggiungerai al file /etc/sysctl.conf. Puoi vedere un elenco completo delle opzioni disponibili usando questo comando:

$ sysctl -a

Esempio

$ 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

Puoi cercare hugepagenell'output in questo modo:

$ 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

Non è lì?

Tuttavia, guardando attraverso l'uscita non ho visto transparent_hugepage. Cercando su Google un po 'di più mi sono imbattuto in questa pagina Oracle che discute proprio questo argomento. La pagina è intitolata: Configurazione di HugePages per Oracle su Linux (x86-64) .

Nello specifico in quella pagina menzionano come disabilitare la funzione hugepage .

estratto

Il metodo preferito per disabilitare Transparent HugePages è aggiungere "transparent_hugepage = never" alla riga di avvio del kernel nel file "/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

Il server deve essere riavviato affinché questo abbia effetto.

In alternativa puoi aggiungere il comando al tuo /etc/rc.localfile.

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

Penso che andrei con la seconda opzione, dal momento che la prima sarà a rischio di essere disinserita quando si aggiorna da un kernel a quello successivo.

Puoi confermare che ha funzionato con il seguente comando dopo il riavvio:

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

7
Puoi fare in modo che la prima opzione sopravviva agli aggiornamenti del kernel aggiungendo transparent_hugepage = never all'opzione GRUB_CMDLINE_LINUX_DEFAULT in / etc / default / grub sulla maggior parte delle distribuzioni.
Rwky,

2
Se l'output di cat /sys/kernel/mm/transparent_hugepage/enabledè [always] madvise never, allora lo stato è alwayso è abilitato (notare le []parentesi intorno always)
ub3rst4r

4
Non confondere gli hugepage e gli hugepage trasparenti. Quest'ultimo può causare molti problemi, principalmente un elevato utilizzo della CPU, mentre cerca costantemente di deframmentare la memoria e convertire le normali pagine da 4 KB in enormi pagine da 2 MB.
Marki555,

2
@Rwky - quando modifico secondo il tuo suggerimento - sottolineo che l'azione successiva dopo il salvataggio del file è di eseguire sudo update-grubper ottenere le "nuove impostazioni" scritte in pietra ". +1 per indicare la riga del file grub.
Faron,

2
Un aggiornamento per quelli su EC2, cloudimg aggiunge il file /etc/default/grub.d/50-cloudimg-settings.cfg che sovrascrive le impostazioni in / etc / default / grub aggiungendo un file /etc/default/grub.d/ 99-transparent-hugepage.cfg con il contenuto GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never" risolverà questo problema.
Rwky,

13

Volevo solo aggiungere a questa domanda mentre stavo cercando di disabilitare gli hugepage trasparenti su CentOS v6 per abilitare TokuDB per MariaDB. Ho aggiunto lo script menzionato da @slm /etc/rc.locale disabilitato hugepages trasparenti. Tuttavia, a causa del modo in cui gli script di avvio funzionano in Linux, /etc/rc.localviene eseguito dopo l'avvio di tutti i servizi. Pertanto, enormi pagine trasparenti venivano disabilitate dopo l'avvio di MariaDB e il motore TokuDB non si inizializzava. L'unico altro modo per disabilitare gli hugepage trasparenti è aggiungendo transparent_hugepage=neveral parametro kernel.

Ho notato il commento di @ 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.e ho scoperto che CentOS non supporta il /etc/default/grubfile ed ero preoccupato di transparent_hugepage=neverscomparire dai parametri del kernel quando viene aggiornato. Ma non preoccuparti, CentOS è configurato per mantenere tutte le modifiche apportate ai parametri del kernel in grub, quindi quando viene aggiornato vengono mantenute.

Per aggiungere anche, il modo corretto di modificare i parametri del kernel per grub è con grubby. Ho creato questo semplice script da aggiungere transparent_hugepage=nevera ciascun kernel con 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

Per un'opzione come questa probabilmente proverei ancora ad aggiungerla a / etc/sysctl.confpoiché verrà applicata in modo coerente a qualsiasi kernel che possa mai essere installato sulla scatola.
slm

Volevo solo aggiungere che se si modifica il file <code> / etc / default / grub </code>, è necessario eseguire grub-mkconfigcome 'root' per generare il file di configurazione effettivo per grub.
seattlegaucho,

3
Per un'istanza di Ubuntu EC2, devo modificare il /etc/default/grub.d/50-cloudimg-settings.cfgfile invece di /etc/default/grubfarlo funzionare.
zhengyue,

Sto usando CentOS 6.6. Ho modificato /etc/rc.localma non funziona per me. Puoi per favore spiegarmi il caso principale.
Sandeep Singh,

@ s.singh Come ho già detto /etc/rc.local is executed after all the services are started, deve essere disabilitato a livello di kernel
ub3rst4r,

6

Ecco un'implementazione usando burattino:

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

Tutto quanto sopra non ha funzionato per me su un Ubuntu 16.04 EC2, ma questo ha fatto:

sudo apt install hugepages
sudo hugeadm --thp-never

4

Dal momento che la linea del kernel transparent_hugepage=neverdisabilita solo la metà di quello che ho bisogno (entrambi, per non aver fastidioso MongoDB / logs), che non ho persistere attraverso systemdscript di avvio, ma ora hanno: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Funziona nello script di avvio di systemctl (se configurato correttamente in uno /etc/systemd/system) o direttamente dal cli così com'è.


Potresti espandere le tue istruzioni per includere anche lo "script correttamente configurato" e i passaggi su come impostare tutto? Le istruzioni ufficiali di MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages mostrano il vecchio modo, mentre ora che systemd è più comune, sarebbe bello averlo in un modo systemd.
SSasa,

3

Nel caso di Redis, emette anche un avviso che suggerisce di disabilitare il THP. Ma come notato nella segnalazione di bug , su molte distro /etc/rc.localviene eseguito dopo i servizi e non ha alcun effetto su di essi fino al loro riavvio. Inoltre, negli ambienti virtualizzati (ad es. Digitalocean) non è possibile controllare le impostazioni di GRUB.

La soluzione in tal caso è utilizzare uno script init dedicato per disabilitare pagine enormi trasparenti come suggerisce questa pagina , in base alle impostazioni X-Start-Before. Ad esempio, Debian init script per 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 

Esattamente quello che stavo cercando.
nelaaro,

2

Grazie a github e PyYoshi
ho trovato questo esempio per systemd

Crea il file

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

Metti questo nel file di servizio

[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

Per utenti 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

Quindi abilitare il servizio

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

1

Se incontri il problema

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

anche con sudo, prova i comandi seguenti:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

Ciao, benvenuto su Unix SE! Nota, sarebbe molto meglio se tu spiegassi anche cosa stanno facendo i tuoi comandi.
user259412,

1

Ecco un trucco rapido per Ansible (non voglio andare a gestire un modello per /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

0

In SLES11 SP3 con bootloader YAST e GRUB dobbiamo aggiungere transparent_hugepage=never[YAST-bootloader-edit-line con parametro kernel opzionale]. NOTA: questo strumento modifica il file /boot/grub/menu.lst.

Solo dopo aver apportato questa modifica e riavviare, il THP è stato disabilitato.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.