Hugepages es una característica del kernel de Linux que permite (al kernel) utilizar páginas de memoria más grandes. Esto puede ser beneficioso para el rendimiento del sistema porque puede reducir el número de fallos en el TLB (Translation Lookaside Buffer), y por lo tanto reducir la cantidad de tiempo empleado en los accesos a la memoria.
Para usar hugepages, necesitas tener un kernel que los soporte (la mayoría de los kernels lanzados después de 2.6.18 lo hacen) y necesitas configurar tu sistema para usarlos. El kernel de Linux asignará automáticamente HugePages cuando sea necesario.
Funcionamiento básico de la memoria física y la swap
Todos los procesos que se están ejecutando en el sistema operativo leen datos de la memoria física (RAM). Estos datos se almacenan en «páginas de memoria» que deben existir en la RAM antes de poderse ejecutar. Si no lo están porque estas páginas se hayan movido a la memoria swap ubicada en el disco por falta de RAM disponible, el sistema operativo las tendrá que mover desde la swap a la RAM para que el proceso pueda encontrar los datos que necesita para su correcta ejecución, penalizando su rendimiento.
A la entrada y salida de páginas de memoria entre la swap y la memoria física se denomina actividad de «page in» y «page out» y es un métrica del sistema operativo que se puede capturar, bien en número de páginas, bien tamaño de datos (MB) para saber si tenemos problemas de rendimiento porque se están moviendo demasiadas páginas de memoria. Sería un indicativo de que necesitaríamos instalar más memoria física en el servidor y estaríamos observando un gran porcentaje de uso de la memoria swap.
Configuración de huge pages para Oracle
Normalmente, en un servidor de se ha instalado una base de datos Oracle, no se instala ningún otro producto. Es decir, suelen ser servidores dedicados.
Para no penalizar el rendimiento de la base de datos, Oracle recomienda bloquear un cierto número de páginas que ha de ser calculado previamente, para que el sistema no las swapee.
Para calcular este número, Oracle pone a disposición el script hugepages.sh que nos da el valor del parámetro del kernel que tenemos que configurar. Veamos un ejemplo:
[root@laqtdot01 ~]# ./hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 1284
[root@laqtdot01 ~]#
Por lo tanto, en los parámetros del kernel, tendríamos que configurar este valor. En RedHat se haría de la siguiente manera:
[root@laqtdot01 ~]# grep huge /etc/sysctl.conf
vm.nr_hugepages=1284
[root@laqtdot01 ~]# sysctl -p |grep huge
vm.nr_hugepages = 1284
[root@laqtdot01 ~]#
Si queremos comprobar que, en este caso, estamos bloqueando 1284 páginas de memoria de ser swapeadas, ejecutaremos el siguiente comando:
[root@laqtdot01 ~]# grep HugePages /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 1284
HugePages_Free: 4
HugePages_Rsvd: 1
HugePages_Surp: 0
[root@laqtdot01 ~]#
Deberemos tener en cuenta de que si modificamos la memoria física del servidor, instalamos una nueva base de datos, reconfiguramos las SGA de Oracle, etc. deberemos volver a calcular este parámetro.
Desactivar transparent hugepages
Otra de las recomendaciones de Oracle es la desactivación de «transparent hugepages». Es una opción que requiere reboot del sistema y que mejorará el rendimiento a la hora de leer y escribir páginas de memoria.
A nivel de sistema operativo, el valor por defecto del tamaño de una página de memoria es de 4KB:
[root@laqtdot01 ~]# getconf PAGESIZE
4096
[root@laqtdot01 ~]#
Pero una aplicación como una base de datos Oracle, escribe muchos más datos en memoria, por lo que conviene reducir el número escrituras y lecturas para mejorar el rendimiento. Por lo tanto, lo que hay que hacer es que el tamaño de las páginas de memoria sea mayor y, para ello, Oracle recomienda usar HugePages. Lo haremos modificando la línea de parámetros del kernel, añadiendo transparent_hugepage=never. Veamos un ejemplo:
[root@laqtdot01 ~]# grep -i huge /boot/grub2/grub.cfg
linux16 /vmlinuz-3.10.0-693.21.1.el7.x86_64 root=/dev/mapper/vg00-rootvol ro audit=1 vmwgfx.enable_fbdev=0 crashkernel=auto rd.lvm.lv=vg00/rootvol rd.lvm.lv=vg00/swapvol biosdevname=0 net.ifnames=0 rhgb quiet transparent_hugepage=never
[root@laqtdot01 ~]#
El tamaño por defecto de las paginas «HugePages» es de 2MB, pero podemos modificarlo durante el arranque del sistema, añadiendo la linea hugepagesz=Tamaño en la línea de parámetros del kernel, pudiendo utilizar los sufijos K, M, y G para especificar KB, MB y GB .
Configuración de un servicio de RedHat 7 para deshabilitar las Huge Pages
- Creamos el servicio
[root@server1 ~]# cat /etc/systemd/system/disable-transparent-huge-pages.service
[Unit]
Description=Disable Transparent Huge Pages (THP)
DefaultDependencies=no
After=sysinit.target local-fs.target
Before=mongod.service
[Service]
Type=oneshot
ExecStart=/bin/sh -c 'echo never | tee /sys/kernel/mm/transparent_hugepage/enabled | tee /sys/kernel/mm/transparent_hugepage/defrag > /dev/null'
[Install]
WantedBy=basic.target
[root@server1 ~]#
- Recargamos la configuración de los servicios del sistema:
[root@server1 ~]# systemctl daemon-reload
- Arrancamos el servicio
[root@lopsdgx01 ~]# systemctl start disable-transparent-huge-pages
- Comprobamos que se ha aplicado correctamente la configuración:
[root@server1 ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[root@server1 ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
[root@server1 ~]#
Deshabilitar las HugePages en Linux RedHat 8
En este caso, los parámetros del kernel se han de configurar en el fichero /boot/grub2/grubenv:
[root@server1 ~]# cat /boot/grub2/grubenv
# GRUB Environment Block
saved_entry=062f875ce1af4e47828eb10505496dc0-4.18.0-240.10.1.el8_3.x86_64
kernelopts=root=/dev/mapper/vg00-rootvol ro audit=1 nomodeset crashkernel=auto resume=/dev/mapper/vg00-swapvol rd.lvm.lv=vg00/rootvol rd.lvm.lv=vg00/swapvol biosdevname=0 net.ifnames=0 rhgb quiet transparent_hugepage=never
boot_success=0
boot_indeterminate=0
Una vez configurado el parámetro transparent_hugepage=never, rebotamos el servidor.
Te puede interesar
Mi pasión por la tecnología me lleva constantemente a explorar las últimas tendencias y aplicaciones, buscando siempre formas de implementar soluciones innovadoras que mejoren la eficiencia. En puerto53.com comparto contenido valioso para ayudar a otros profesionales y entusiastas de la informática a navegar y dominar el complejo mundo de la tecnología. Mi especialidad en Linux RedHat.
Más sobre mí en el este enlace,