Los parámetros innodb_buffer_pool_size y el valor de max_connections son dos de las cosas más importantes que tienes que optimizar si estás gestionando una base de datos MySQL o MariaDB, algo bastante común estos días si tienes una página web con WordPress. Y a veces resulta complicado elegir bien los valores en función de la memoria RAM de tu servidor y la carga de trabajo.
Y no puedes dejar al azar el valor de InnoDB Buffer Pool: actúa como un caché para los datos y los índices de las tablas InnoDB. Al aumentar este valor, se puede almacenar más datos en memoria, y se reduce el acceso al disco y mejora muchísimo el rendimiento de las consultas. Y el valor por defecto suele ser bajo, unos 128 MB. Si tenemos en cuenta que la mayoría de los servicios de hospedaje web como Linode, DigitalOcean, Vultr suelen ofrecer instancias con memoria RAM de 2 GB hasta 32 GB (y mucho más), tenemos margen para aumentar la cantidad de memoria que asignamos a nuestra base de datos.
Y llegados a este punto, seguro que has oído que conviene poner el valor de InnoDB Buffer Pool al 80 % de la RAM disponible en tu servidor. ¡Ojo! Si tu servidor tiene más de 8 GB de memoria RAM. Bueno, puede ser un buen valor para comenzar, pero tienes que tener dejar espacio para el resto de aplicaciones en tu servidor y para tu sistema operativo, así que primero tienes que averiguar cuanta memoria está usando cada servicio para ver cuanto le podemos asignar a MariaDB o MySQL (suponiendo que estás corriendo más cosas en tu servidor, que suele ser lo normal).
- Te puede interesar: Cómo configurar la memoria SWAP en un servidor Rocky Linux 9
Calculamos cuanta memoria estamos usando en el servidor por servicio activo
Vamos a usar un programa gratuito que puedes descargar en tu servidor: ps_mem. Puedes descargarlo directamente, o puedes instalar con DNF (en mi caso porque uso Rocky Linux):
dnf install ps_mem
En i caso, lo he descargado, y ejecuto directamente ps_mem.py con el siguiente comando (después de haberle dado permisos de ejecución si no los tiene con chmod +x ps_mem.py):
./ps_mem.py
Y obtienes un resultado como este (para un total de memoria en el servidor de 16 GB):
Private + Shared = RAM used Program
3.1 MiB + 2.5 MiB = 5.7 MiB systemd (3)
7.4 MiB + 3.7 MiB = 11.1 MiB rsyslogd
11.5 MiB + 10.5 KiB = 11.5 MiB ossec-analysisd
18.6 MiB + 438.5 KiB = 19.1 MiB backup.pl
18.9 MiB + 270.5 KiB = 19.2 MiB shellserver.pl
4.4 MiB + 15.3 MiB = 19.7 MiB perl
19.7 MiB + 403.5 KiB = 20.1 MiB lfd - sleeping
9.0 MiB + 15.8 MiB = 24.8 MiB systemd-journald
17.5 MiB + 15.3 MiB = 32.8 MiB miniserv.pl (2)
35.5 MiB + 16.5 KiB = 35.5 MiB ossec-syscheckd
51.6 MiB + 7.0 MiB = 58.5 MiB httpd (5)
195.0 MiB + 5.5 KiB = 195.0 MiB inotifywait
309.0 MiB + 73.5 KiB = 309.1 MiB memcached
1.7 GiB + 123.5 KiB = 1.7 GiB mariadbd
3.6 GiB + 1.0 GiB = 4.6 GiB php-fpm (219)
---------------------------------
7 GiB
=================================
Cómo calculo el valor que puedo asignar a innodb_buffer_pool_size
Si tienes 16 GB de RAM, puedes descontar toda la memoria RAM que usas para que funcione el sistema (quitando la que ya usa MariaDB) y saber más o menos cuanta memoria libre te queda. En mi caso, 16 GB – 6 GB = 10 GB (de manera aproximada). Pero como quiero ser un poco conservador, voy a dejar otros 4 GB para el SO y otros programas, con lo que al final tengo 6 GB de memoria RAM que puedo asignar a mi base de datos.
Ahora podría calcular el 80 % de esa memoria RAM para usar en innodb_buffer_pool_size, con los que tendría un valor de innodb_buffer_pool_size = 4 GB.
- La fórmula podría ser la siguiente: INNODB_BUFFER_POOL_SIZE = Memoria TOTAL del SERVIDOR – USO_ACTUAL_RAM_GB – MEMORIA_PARA_SO_Y_OTROS.
O simplemente puedes empezar a ajustar este parámetro desde un 50 % hasta un 80 % del total de memoria libre de tu servidor (no de la memoria total).
Para que te sirva de referencia, si solo tuvieras tu instalación de MariaDB o MySQL en tu servidor sin nada más, podrías ajustar el parámetro de esta manera:
Memoria RAM disponible servidor | Tamaño de InnoDB Buffer Pool Size |
---|---|
4 GB | 2 GB |
8 GB | 4-8 GB |
16 GB | 8-12 GB |
32 GB | 16-24 GB |
64 GB | 32-56 GB |
128 GB | 64-96 GB |
256 GB | 128-192 GB |
- ¡Ojo! También tienes que tener en cuenta que si subes mucho el número de max_connections, se va a incrementar el uso de RAM.
¿Dónde cambias todo esto?
Tienes que editar el archivo my.cnf de tu instalación (en mi caso, en Rocky Linux):
- /etc/my.cnf
Pero también puedes tener la configuración en:
- /etc/my.cnf.d/mariadb-server.cnf
Puedes poner los nuevos parámetros en cualquiera de los dos lados, que MariaDB (en este caso), lo va a tomar como válidos.
Editas el archivo:
sudo vi /etc/my.cnf
Y añades:
# Tamaño del grupo de búfer de InnoDB
innodb_buffer_pool_size = 4G
Ahora reinicias la base de datos:
sudo systemctl restart mysql
¿Cómo compruebas que todo marcha bien y si tienes que cambiar más valores de tu instalación?
Puedes descargar el programa mysqltuner.pl, que te va a dar valoraciones de tu instalación y recomendaciones para ajustar este parámetro y el resto de variables que controlan la base de datos. MySQLTuner es un script escrito en Perl que te permite revisar una instalación de MySQL rápidamente y hacer ajustes para aumentar el rendimiento y la estabilidad.
Al final de todo te dirá si tienes que cambiar los valores de algunos de los parámetros más importantes.
Conclusión
Cambiar y optimizar los valores de las principales variables que controlan el comportamiento de tu base de datos tiene más de prueba y de error, que de seguir ciertas fórmulas. Puedes empezar por unos mínimos, e ir haciendo pruebas de rendimiento. mysqltuner.pl es un gran aliado.
Unos consejos finales:
- Servidor con 8 GB de RAM: Deberías asignar entre 2 y 3 GB a innodb_buffer_pool_size, asegurando que haya suficiente memoria para el sistema operativo y otros procesos.
- Servidor con 16 GB de RAM: Podrías asignar entre 8 y 10 GB a innodb_buffer_pool_size, dejando suficiente memoria para php-fpm, MariaDB y otros procesos. Si eres más conservador, empieza por unos 4, 6 GB.
- Servidor con 32 GB de RAM o más: Puedes asignar de manera segura entre 16 y 24 GB a innodb_buffer_pool_size.
Referencias: