Ayer expliqué cómo configuré PHP-FPM en modo "ondemand" en mi VPS para minimizar el consumo de memoria. Hoy comparto mi configuración del motor InnoDB, la cual me permitió reducir bastante el consumo de memoria del servidor de bases de datos MySQL.



Cuando se instala MySQL (en Debian y derivados) se habilita InnoDB por defecto, con un archivo de datos ("ibdata1") de 10 MB dentro del directorio /var/lib/mysql/. Este archivo puede crecer mucho con el paso del tiempo, pero no viene al caso de este artículo. Sin embargo, en la configuración por defecto del servidor mysqld no se incluye ninguna (de las muchas) opciones específicas de InnoDB.

Existe una gran cantidad de variables y opciones de inicio de InnoDB que se pueden personalizar, algunas de las cuales afectan al consumo de memoria (ver InnoDB Startup Options and System Variables). En este artículo sólo me voy a concentrar en aquellas.

Editar el archivo de configuración de MySQL:

# nano /etc/mysql/my.cnf

Agregar o modificar las siguientes variables, debajo de la sección [mysqld]:

innodb_buffer_pool_size         = 16M
innodb_flush_method             = O_DIRECT
innodb_log_buffer_size          = 1M
innodb_thread_concurrency       = 8
innodb_additional_mem_pool_size = 2097152
  • innodb_buffer_pool_size - Indica el tamaño del buffer pool, el área de memoria que InnoDB utiliza como caché de datos de tablas e índices. El valor por defecto es 128 MB, por ende es recomendable bajarlo en caso de no contar con suficiente memoria.
  • innodb_flush_method - Especifica el método utilizado para escribir los cambios en disco. Mediante O_DIRECT, los cambios se escriben directamente a disco, lo que evita el doble buffering (buffer del motor de base de datos y buffer del filesystem).
  • innodb_log_buffer_size - Es el tamaño del buffer que InnoDB utiliza para escribir los archivos de log en disco. Por defecto es 8 MB (16 MB a aprtir de la versión 5.7.6).
  • innodb_thread_concurrency - Indica el máximo número de hilos en ejecución. El valor por defecto es 0, el cual se interpreta como concurrencia infinita, es decir sin límite al número de hilos. Modificar esta variable no afecta el consumo de memoria, sino el consumo de CPU.
  • innodb_additional_mem_pool_size - Especifica el tamaño (en bytes) del pool de memoria utilizado por InnoDB para almacenar metadatos de objetos y tablas, y otras estructuras. El valor por defecto es 8 MB. Hay que tener cuidado con esta variable, ya que si InnoDB se queda sin espacio en este pool comienza a reservar memoria adicional e imprime mensajes en el log al respecto. Esta variable es obsoleta a partir de la versión 5.6.3.

Lógicamente esta configuración minimiza el consumo de memoria RAM en detrimento del rendimiento del motor InnoDB.

Ver también:

innodb_ft_cache_size.

innodb_ft_total_cache_size (a partir de 5.7.2).

Referencias

InnoDB Initialization and Startup Configuration

Innodb Performance Optimization Basics


Tal vez pueda interesarte


Compartí este artículo