Cómo optimizar el valor de innodb_buffer_pool_size en MySQL o MariaDB

Publicada:

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).

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 servidorTamaño de InnoDB Buffer Pool Size
4 GB2 GB
8 GB4-8 GB
16 GB8-12 GB
32 GB16-24 GB
64 GB32-56 GB
128 GB64-96 GB
256 GB128-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?

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.

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:


Descubre más desde algoentremanos.com

Suscríbete y recibe las últimas entradas en tu correo electrónico.

Foto del autor

Ivan Benito

Apasionado de la lectura y los viajes, experto en tecnología e informática y fan de la privacidad online. Desde el año 2007 me he dedicado al SEO, a escribir y a crear páginas web con WordPress sobre todo tipo de temáticas. Si tienes alguna duda y necesitas ayuda... ¡Pregúntame!

Si tienes preguntas, quieres que hagamos una review de una app, programa o producto, simplemente mándanos un e-mail mediante nuestro formulario de contacto. Te contestaremos en el menor tiempo posible. ¡Muchas gracias y salU2! Algoentremanos realiza reviews de manera profesional y en muchas ocasiones recibimos compensación de las compañías cuyos productos revisamos. Probamos cada producto a fondo y otorgamos altas calificaciones solo a los mejores. La propiedad de Algoentremanos.com es independiente y las opiniones expresadas aquí son solo nuestras. Algunos enlaces del artículo son afiliados: pueden generar un beneficio a algoentremanos.com. Saber más.

Deja un comentario

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.