deshabilitar las enormes páginas transparentes

63

Estamos instalando SAP HANA en una máquina RAID . Como parte del paso de instalación, se menciona que,

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

Entonces, en lugar de tiempo de ejecución, si quisiera hacer esto un cambio permanente, ¿debería agregar la línea anterior dentro del /proc/vmstatarchivo?

Ramesh
fuente
2
Tenga en cuenta que si está utilizando algunas de las soluciones mencionadas aquí, en un sistema que también funciona 'sintonizado', sintonizado puede anular esas soluciones. Vea aquí para más información: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Respuestas:

80

Para hacer que opciones como esta sean permanentes, generalmente las agregará al archivo /etc/sysctl.conf. Puede ver una lista completa de las opciones disponibles con este comando:

$ sysctl -a

Ejemplo

$ 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

Puede buscar hugepageen la salida así:

$ 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

¿No está ahí?

Sin embargo, mirando a través de la salida no vi transparent_hugepage. Buscando en Google un poco más, me encontré con esta página de Oracle que analiza este mismo tema. La página se titula: Configuración de HugePages para Oracle en Linux (x86-64) .

Específicamente en esa página mencionan cómo deshabilitar la función de página enorme .

extracto

El método preferido para deshabilitar Transparent HugePages es agregar "transparent_hugepage = never" a la línea de arranque del núcleo en el archivo "/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

El servidor debe reiniciarse para que esto surta efecto.

Alternativamente, puede agregar el comando a su /etc/rc.localarchivo.

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

Creo que elegiría la segunda opción, ya que la primera correrá el riesgo de desarmarse cuando actualice de un núcleo a otro.

Puede confirmar que funcionó con el siguiente comando después de reiniciar:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
slm
fuente
77
Puede hacer que la primera opción sobreviva a las actualizaciones del núcleo agregando transparent_hugepage = never a la opción GRUB_CMDLINE_LINUX_DEFAULT en / etc / default / grub en la mayoría de las distribuciones.
Rwky
2
Si la salida de cat /sys/kernel/mm/transparent_hugepage/enabledes [always] madvise never, entonces el estado es alwayso está habilitado (tenga en cuenta los []corchetes always)
ub3rst4r
44
No confunda las grandes páginas y las grandes páginas transparentes. Esto último puede causar muchos problemas, principalmente un alto uso de la CPU al intentar constantemente desfragmentar la memoria y convertir páginas normales de 4kB en enormes páginas de 2MB.
Marki555
2
@Rwky: al ajustar según su sugerencia, enfatizaría que la siguiente acción después de guardar el archivo es ejecutar sudo update-grubpara obtener la nueva configuración "escrita en piedra". +1 para señalar la línea del archivo grub.
Faron
2
Una actualización para aquellos en EC2, cloudimg agrega el archivo /etc/default/grub.d/50-cloudimg-settings.cfg que anula la configuración en / etc / default / grub agregando un archivo /etc/default/grub.d/ 99-transparent-hugepage.cfg con el contenido GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = nunca" resolverá esto.
Rwky
13

Solo quería agregar a esta pregunta, ya que estaba tratando de deshabilitar enormes páginas transparentes en CentOS v6 para habilitar TokuDB para MariaDB. Agregué el script mencionado por @slm /etc/rc.localy deshabilitó las enormes páginas transparentes. Sin embargo, debido a la forma en que funcionan los scripts de inicio en Linux, /etc/rc.localse ejecuta después de que se inician todos los servicios. Por lo tanto, las páginas enormes transparentes se deshabilitaron después de que MariaDB ya se inició y el motor TokuDB no se inicializó. La única otra forma de deshabilitar las enormes páginas transparentes es agregando transparent_hugepage=neveral parámetro del núcleo.

Noté el comentario 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.y descubrí que CentOS no es compatible con el /etc/default/grubarchivo y estaba preocupado por transparent_hugepage=neverdesaparecer de los parámetros del núcleo cuando se actualiza. Pero no se preocupe, CentOS está configurado para mantener cualquier cambio realizado en los parámetros del kernel en grub para que cuando se actualice se mantengan.

Para agregar también, la forma correcta de modificar los parámetros del kernel para grub es con grubby. Creé este script simple para agregar transparent_hugepage=nevera cada núcleo 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
ub3rst4r
fuente
Para una opción como esta, probablemente aún intente agregarla a / etc/sysctl.confya que se aplicará de manera consistente a cualquier Kernel que alguna vez se instale en la caja.
slm
Solo quería agregar que si modifica el archivo <code> / etc / default / grub </code>, debe ejecutarlo grub-mkconfigcomo 'root' para generar el archivo de configuración real de grub.
seattlegaucho
3
Para una instancia de ubuntu EC2, tengo que modificar el /etc/default/grub.d/50-cloudimg-settings.cfgarchivo en lugar de /etc/default/grubhacerlo para que funcione.
zhengyue
Estoy usando CentOS 6.6. He modificado /etc/rc.localpero no funciona para mí. ¿Me puede explicar el caso raíz?
Sandeep Singh
@ s.singh Como dije anteriormente /etc/rc.local is executed after all the services are started, debe deshabilitarse en el nivel del kernel
ub3rst4r
6

Aquí hay una implementación con títeres:

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

Todo lo anterior no funcionó para mí en un Ubuntu EC.04 16.04, pero esto sí:

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

Desde la línea del kernel transparent_hugepage=neversólo se desactiva la mitad de lo que necesito (ambos, por molesto mongodb su defecto / logs), que no persistió a través de systemdscript de inicio, pero ahora tienen: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Eso funciona en el script de arranque systemctl (cuando está configurado correctamente /etc/systemd/system) o directamente desde el cli tal como está.

Rob Jens
fuente
¿Podrías expandir tus instrucciones para incluir también el "script configurado correctamente" y los pasos para configurar todo? Las instrucciones oficiales de MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages muestran la forma antigua, mientras que ahora que systemd es más común, sería bueno tener esto de manera sistemática.
ssasa
3

En el caso de Redis, también emite una advertencia que sugiere desactivar THP. Pero como se señaló en el informe de error , en muchas distribuciones /etc/rc.localse ejecuta después de los servicios y no tiene ningún efecto sobre ellos hasta que se reinicie. También tenga en cuenta que en entornos virtualizados (por ejemplo, Digitalocean) no puede controlar la configuración de GRUB.

La solución en tal caso es usar un script de inicio dedicado para deshabilitar páginas enormes transparentes como sugiere esta página , por configuración X-Start-Before. Por ejemplo, Debian init script 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
fuente
Exactamente lo que estaba buscando.
nelaaro
2

Gracias a github y PyYoshi
encontré este ejemplo para systemd

Crea el archivo

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

Pon esto en el archivo de servicio

[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 usuarios de 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

Luego habilite el servicio

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages
nelaaro
fuente
1

Si te encuentras con el problema

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

incluso con sudo, prueba los siguientes comandos:

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
fuente
Hola, bienvenido en el Unix SE! Tenga en cuenta que sería mucho mejor si también explicara qué están haciendo sus comandos.
user259412
1

Aquí hay un truco rápido para Ansible (no quiero administrar una plantilla /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
fuente
0

En SLES11 SP3 con el gestor de arranque YAST y GRUB, tenemos que agregar transparent_hugepage=never[YAST-bootloader-edit-line con parámetro de kernel opcional]. NOTA: Esta herramienta cambia el archivo /boot/grub/menu.lst.

Solo después de hacer este cambio y reiniciar resultó en la desactivación de THP.

Detlef
fuente