desativar páginas enormes transparentes

63

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 tempo de execução, se eu quisesse fazer uma alteração permanente, devo adicionar a linha acima dentro do /proc/vmstatarquivo?

Ramesh
fonte
2
Observe que, se você estiver usando algumas das soluções mencionadas aqui, em um sistema que também execute 'tuned', o tuned poderá substituir essas soluções. Veja aqui para mais informações: bugzilla.redhat.com/show_bug.cgi?id=1189868
DeJay Clayton

Respostas:

80

Para tornar opções como essa permanentes, você normalmente as adiciona 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 hugepagena 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á aí?

No entanto, olhando através da saída eu não vi transparent_hugepage. Pesquisando um pouco mais, encontrei esta página da Oracle que discute esse mesmo tópico. A página tem o título: Configurando o HugePages para Oracle no Linux (x86-64) .

Especificamente nessa página, eles mencionam como desativar o recurso enorme página .

excerto

O método preferido para desativar o Transparent HugePages é adicionar "transparent_hugepage = never" à linha de inicialização do kernel no arquivo "/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

O servidor deve ser reiniciado para que isso entre em vigor.

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

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

Eu acho que iria com a segunda opção, já que a primeira corre o risco de ficar desconfigurada quando você atualiza de um kernel para o próximo.

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

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
fonte
7
Você pode fazer a primeira opção sobreviver às atualizações do kernel adicionando transparent_hugepage = never à opção GRUB_CMDLINE_LINUX_DEFAULT em / etc / default / grub na maioria das distribuições.
Rwky
2
Se a saída de cat /sys/kernel/mm/transparent_hugepage/enabledé [always] madvise never, então o status é alwaysou está ativado (observe os []colchetes always)
ub3rst4r
4
Não confunda páginas enormes e páginas transparentes. O último pode causar muitos problemas, principalmente o alto uso da CPU, enquanto constantemente tenta desfragmentar a memória e converter páginas normais de 4kB em páginas enormes de 2 MB.
Marki555
2
@Rwky - ao ajustar conforme sua sugestão - enfatizo que a próxima ação depois de salvar o arquivo é executada sudo update-grubpara obter as novas configurações "escritas em pedra". +1 para apontar a linha do arquivo grub.
Faron
2
Uma atualização para aqueles no EC2, cloudimg adiciona o arquivo /etc/default/grub.d/50-cloudimg-settings.cfg que substitui as configurações em / etc / default / grub adicionando um arquivo /etc/default/grub.d/ 99-transparent-hugepage.cfg com o conteúdo GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never" resolverá isso.
Rwky
13

Eu só queria acrescentar a esta pergunta, enquanto tentava desabilitar enormes páginas transparentes no CentOS v6 para ativar o TokuDB para MariaDB. Eu adicionei o script mencionado por @slm a /etc/rc.locale desabilitou enormes páginas 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 desabilitadas depois que o MariaDB já havia sido iniciado e o mecanismo TokuDB não inicializou. A única outra maneira de desativar enormes páginas transparentes é adicionando transparent_hugepage=neverao parâmetro do kernel.

Percebi o comentário do @ 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 /etc/default/grubarquivo e estava preocupado em transparent_hugepage=neverdesaparecer dos parâmetros do kernel quando ele é atualizado. Mas não se preocupe, o CentOS está configurado para manter as alterações feitas nos parâmetros do kernel no grub; portanto, quando atualizadas, elas são mantidas.

Para adicionar também, a maneira correta de modificar os parâmetros do kernel para grub é com grubby. Eu criei este script simples para adicionar transparent_hugepage=nevera 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
ub3rst4r
fonte
Para uma opção como essa, eu provavelmente ainda tentaria adicioná-la a /, etc/sysctl.confjá que ela será aplicada de maneira consistente a qualquer Kernel que possa estar instalado na caixa.
slm
Eu só queria acrescentar que, se você modificar o arquivo <code> / etc / default / grub </code>, precisará executar grub-mkconfigcomo 'root' para gerar o arquivo de configuração real do grub.
Seattlegaucho
3
Para uma instância do ubuntu EC2, tenho que modificar o /etc/default/grub.d/50-cloudimg-settings.cfgarquivo em vez do /etc/default/grubpara fazê-lo funcionar.
Zhengyue
Estou usando o CentOS 6.6. Eu modifiquei, /etc/rc.localmas não está funcionando para mim. Você pode me explicar o caso raiz.
Sandeep Singh
@ s.singh Como afirmei /etc/rc.local is executed after all the services are startedpor isso precisa ser desativado no nível do kernel
ub3rst4r
6

Aqui está uma implementação usando 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",
}
J Maurer
fonte
6

Todas as opções acima não funcionaram para mim no EC2 Ubuntu 16.04, mas isso aconteceu:

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

Desde a linha do kernel transparent_hugepage=neverúnica desativa metade do que eu preciso (ambos, para MongoDB irritante falhando / logs), que eu não persistem através de systemdscript de inicialização, mas agora têm: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Isso funciona tanto no script de inicialização systemctl (quando um está configurado corretamente /etc/systemd/system) quanto diretamente no cli como está.

Rob Jens
fonte
Você poderia expandir suas instruções para incluir também o "script configurado corretamente" e as etapas para configurar tudo? As instruções oficiais do MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages mostram o caminho antigo, enquanto agora que systemd é mais comum, seria bom ter isso de maneira systemd.
ssasa
3

No caso do Redis, ele também emite um aviso que sugere desativar o THP. Porém, conforme observado no relatório de erros , em muitas distros /etc/rc.localé executado após os serviços e não tem efeito neles até que sejam reiniciados. 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 init dedicado para desativar grandes páginas transparentes, como sugere esta página , pelas configurações X-Start-Before. Por exemplo, o script init do Debian 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 
saaj
fonte
Exatamente o que eu estava procurando.
Nelaaro
2

Graças ao github e ao PyYoshi
, encontrei este exemplo para o 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
nelaaro
fonte
1

Se você encontrar o problema

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

mesmo com o sudo, tente 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'
Qiang Du
fonte
Olá, seja bem-vindo ao Unix SE! Observe que seria muito melhor se você também explicasse o que seus comandos estão fazendo.
user259412
1

Aqui está um rápido hack para o Ansible (não quero gerenciar um modelo /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
fonte
0

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

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

Detlef
fonte