Optimizando MySQL 5.6 innodb_flush_method

El parámetro innodb_flush_method es el método que utilizará MySQL para vaciar los datos y logs que vaya recopilando durante su funcionamiento.

Este post en realidad será una traducción del manual de MySQL y otras fuentes del inglés porque como se verá la configuración ideal es a base de prueba y error.

schema-sync

Veamos un glosario de términos necesarios para entender este post

fsync

La función fsync () puede ser utilizada por una aplicación para indicar que todos los datos asociados  a archivos abiertos serán transferidos al dispositivo de almacenamiento asociado con el archivo descrito de una manera dependiente de la implementación del sitema. La función fsync no se detiene hasta que el sistema ha completado la acción o hasta que se detecta un error.

La función fsync () obliga a todas las operaciones actuales en la cola de entrada / salida asociadas con un archivo a la sincronización. Todas las operaciones de E / S se realizan cuidando la integridad del archivo al finalizar el proceso de sincronización usando los protocolos definidos por el sistema en uso.

fdatasync

La función fdatasync es básicamente igual que la función fsync la única diferencia es que la primera garantiza la integridad del archivo mientras fdatasync garantiza la integridad de los datos.

Direct I/O

Se utiliza para aplicaciones que desean evitar el almacenamiento en búfer de la memoria caché del sistema de archivos. Cuando Direct I / O se utiliza para un archivo, los datos se transfieren directamente desde el disco a la memoria intermedia de la aplicación, sin el uso de la caché del búfer del archivo. Direct I / O se puede utilizar para un archivo ya sea montando el sistema de archivos correspondiente o abriendo el archivo con el flag O_DIRECT especificado en la llamada open() al sistema. Direct I / O reduce el consumo de CPU y elimina la sobrecarga de la copia de datos dos veces - primero entre el disco y la caché del búfer archivo y allí a la aplicación.

SAN (Storage Area Network)

Una red de área de almacenamiento es red de almacenamiento integral. Se trata de una arquitectura completa que agrupa una red de alta velocidad de canal de fibra o iSCSI, un equipo de interconexión dedicado (conmutadores, puentes) y elementos de almacenamiento de red (discos duros).

RAID (Redundant Array of Independent Disks)

Es un sistema de almacenamiento que usan múltiples discos duros o SSD entre los que se distribuyen o replican los datos.

Teniendo todos estos conceptos aclarados veamos lo que dice la documentación de MySQL sobre el vaciado de datos de InnoDB.

Por defecto, InnoDB utiliza fsync () para volcar los datos y archivos de registro. Si la opción que se establece en innodb_flush_method es O_DSYNC entonces InnoDB utiliza O_SYNC para abrir y limpiar los archivos de registro y fsync () para volcar los archivos de datos. Si se especifica O_DIRECT (disponible en algunas versiones de GNU / Linux, FreeBSD y Solaris), InnoDB utiliza O_DIRECT (o directio () de Solaris) para abrir los archivos de datos, y utiliza fsync () para volcar los datos y archivos de registro. Nótese que InnoDB utiliza fsync () en lugar de fdatasync (), y que no utiliza O_DSYNC por defecto porque ha habido problemas con él en muchas variedades de Unix. Esta variable sólo es relevante para Unix. En Windows, el método flush es siempre async_unbuffered y no se puede cambiar.

Dependiendo de la configuración del hardware la configuración innodb_flush_method a O_DIRECT puede tener un efecto positivo o negativo en el rendimiento. Comparar su configuración particular para decidir qué configuración utilizar. La combinación de las operaciones de la carga de trabajo de lectura y escritura también puede afectar el ajuste que mejor se adapte a tus necesidades. Por ejemplo, en un sistema con un controlador RAID de hardware y la memoria caché de escritura respaldada por batería, O_DIRECT puede ayudar a evitar la doble amortiguación entre el buffer de InnoDB y la caché del sistema de archivos del sistema operativo. En algunos sistemas donde se encuentran los datos InnoDB y archivos de registro en una SAN, el valor por defecto ( O_DSYNC) podría ser más efectivo y rápido para la lectura de datos con una pesada carga de trabajo en la mayoría de las instrucciones SELECT.

Pruebe siempre este parámetro con el mismo tipo de hardware y la carga de trabajo que refleja el entorno de producción.

Los diferentes valores de esta variable puede tener un marcado efecto en el rendimiento de InnoDB. Por ejemplo, como he explicado antes, en algunos sistemas donde se encuentran los datos InnoDB y archivos de registro en una SAN, se ha comprobado que establecer innodb_flush_method como O_DIRECT puede degradar el rendimiento de las sentencias SELECT simples por un factor de tres.

¿A qué se debe esto? Pues porque O_DIRECT omite todo el sistema de cacheo del sistema operativo. Un sistema SAN puede ser un sistema de almacenamiento muy rápido, pero por lo general va a estar en otro lugar, oculto detrás de otras capas. Mediante el uso de O_DIRECT, que elimina el cacheo local, se fuerza a InnoDB a trabajar sobre el sistema de almacenamiento directamente cada vez.

Mientras al contrario en sistemas RAID1 en el propio servidor se pude ver una mejoraría del 15 % utilizando O_DIRECT.

Depende de cada uno el sistema que elijamos.

Comentarios