disable hugepages transparentes

57

Estamos instalando o SAP HANA em uma máquina RAID . Como parte da etapa de instalação, é mencionado que

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

Então, em vez de runtime, se eu quisesse fazer uma alteração permanente, deveria adicionar a linha acima dentro de /proc/vmstat file?

    
por Ramesh 06.11.2013 / 23:55

11 respostas

72

Para criar opções como essa permanente, você normalmente as adicionará ao arquivo /etc/sysctl.conf . Você pode ver uma lista completa das opções disponíveis usando este comando:

$ sysctl -a

Exemplo

$ 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

Você pode procurar hugepage na saída assim:

$ 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

Não está lá?

No entanto, ao analisar a saída, não vi transparent_hugepage . Pesquisando um pouco mais eu encontrei esta página da Oracle que discute este mesmo tópico. A página é intitulada: Configurando o HugePages for Oracle em Linux (x86-64) .

Especificamente nessa página, eles mencionam como desativa o recurso de página de visita .

trecho

The preferred method to disable Transparent HugePages is to add "transparent_hugepage=never" to the kernel boot line in the "/etc/grub.conf" file.

   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

The server must be rebooted for this to take effect.

Como alternativa, você pode adicionar o comando ao seu arquivo /etc/rc.local .

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

Acho que escolheria a segunda opção, pois a primeira corre o risco de ficar desanexada quando você atualiza de um kernel para o outro.

Você pode confirmar que funcionou com o seguinte comando após a reinicialização:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
    
por 07.11.2013 / 03:55
12

Eu só queria adicionar a essa pergunta, já que eu estava tentando desativar as páginas de entrada transparentes no CentOS v6 para habilitar o TokuDB para MariaDB. Eu adicionei o script mencionado por @slm a /etc/rc.local e ele desativou as páginas de abraços transparentes. No entanto, devido à maneira como os scripts de inicialização funcionam no Linux, /etc/rc.local é executado depois que todos os serviços são iniciados. Portanto, páginas enormes e transparentes estavam sendo desativadas depois que o MariaDB já era iniciado e o mecanismo do TokuDB não era inicializado. A única outra maneira de desativar as abraços transparentes é adicionando transparent_hugepage=never ao parâmetro do kernel.

Percebi o comentário 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. e descobri que o CentOS não suporta o arquivo /etc/default/grub e estava preocupado com transparent_hugepage=never desaparecendo dos parâmetros do kernel quando ele é atualizado. Mas não se preocupe, o CentOS é configurado para manter quaisquer alterações feitas nos parâmetros do kernel no grub, de modo que quando elas forem atualizadas, elas serão mantidas.

Para adicionar também, a maneira correta de modificar os parâmetros do kernel para o grub é com grubby . Eu criei este script simples para adicionar transparent_hugepage=never a cada kernel com 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
    
por 30.10.2014 / 07:28
6

Aqui está uma implementação usando o fantoche:

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",
}
    
por 10.10.2014 / 06:27
6

Todos os itens acima não funcionaram para mim em um EC2 Ubuntu 16.04, mas isso aconteceu:

sudo apt install hugepages
sudo hugeadm --thp-never
    
por 17.12.2016 / 22:33
4

Como a linha do kernel transparent_hugepage=never desativa apenas metade do que eu preciso (ambos, para mongodb failing / logs irritantes), eu não persiste através do script de inicialização systemd , mas agora tenho: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled . Isso funciona no script de inicialização systemctl (quando configurado corretamente em /etc/systemd/system ) ou diretamente do cli como está.

    
por 28.05.2015 / 22:21
3

No caso do Redis, ele também emite um aviso que sugere desativar o THP. Mas como observado em o relatório de bugs , em muitas distros /etc/rc.local é executado após os serviços e não tem efeito sobre eles até que eles reiniciem. Observe também que em ambientes virtualizados (por exemplo, Digitalocean) você não pode controlar as configurações do GRUB.

A solução nesse caso é usar o script dedicado init para desativar páginas enormes e transparentes como esta página sugere, pelas configurações X-Start-Before . Por exemplo, o script Debian init para 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 
    
por 26.02.2017 / 15:07
0

No SLES11 SP3 com o carregador de boot YAST e GRUB, temos que adicionar transparent_hugepage=never em [YAST-bootloader-edit- line com o parâmetro opcional do kernel]. NOTA: Esta ferramenta altera o arquivo /boot/grub/menu.lst .

Somente depois de fazer essa alteração e reinicialização resultou na desativação do THP.

    
por 10.07.2015 / 14:29
0

Aqui está outra solução fantoche no Forge: link

Use apenas:

include remove_hugepage

na sua definição de nó de marionete.

    
por 22.07.2015 / 23:52
0

Graças ao github & PyYoshi
Eu encontrei este exemplo para systemd

Crie o arquivo

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

Coloque isso no arquivo de serviço

[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

Para usuários 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

Em seguida, ative o serviço

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
    
por 09.05.2017 / 13:09
0

Um rápido corte no Ansible: (Eu não quero ir gerenciar um template para /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

    
por 26.05.2017 / 01:03
0

Se você encontrar o problema

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

mesmo com o sudo, experimente os comandos abaixo:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'
    
por 26.07.2018 / 12:15