Tabla de contenidos
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:
[[email protected] ~]# ./hugepages_settings.sh
Recommended setting: vm.nr_hugepages = 1284
[[email protected] ~]#
Por lo tanto, en los parámetros del kernel, tendríamos que configurar este valor. En RedHat se haría de la siguiente manera:
[[email protected] ~]# grep huge /etc/sysctl.conf
vm.nr_hugepages=1284
[[email protected] ~]# sysctl -p |grep huge
vm.nr_hugepages = 1284
[[email protected] ~]#
Si queremos comprobar que, en este caso, estamos bloqueando 1284 páginas de memoria de ser swapeadas, ejecutaremos el siguiente comando:
[[email protected] ~]# grep HugePages /proc/meminfo
AnonHugePages: 0 kB
HugePages_Total: 1284
HugePages_Free: 4
HugePages_Rsvd: 1
HugePages_Surp: 0
[[email protected] ~]#
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:
[[email protected] ~]# getconf PAGESIZE
4096
[[email protected] ~]#
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:
[[email protected] ~]# 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
[[email protected] ~]#
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
[[email protected] ~]# 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
[[email protected] ~]#
- Recargamos la configuración de los servicios del sistema:
[[email protected] ~]# systemctl daemon-reload
- Arrancamos el servicio
[[email protected] ~]# systemctl start disable-transparent-huge-pages
- Comprobamos que se ha aplicado correctamente la configuración:
[[email protected] ~]# cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[[email protected] ~]# cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
[[email protected] ~]#
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:
[[email protected] ~]# 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.