En uno de mis entornos de producción, tenemos dos instancias ejecutándose en un clúster RedHat, con una instancia de producción asociada al clúster.
Tenemos 125G de memoria principal con 24G InnoDB buffer pool ocupado por instancia1 y 12G ocupado por instancia2, que no está asociado con el clúster RedHat. Los registros de datos y transacciones se encuentran en la partición del disco LVM con un sistema de archivos ext3.
Para un aumento de rendimiento y mejor de E / S de las que he decidido cambiar innodb_flush_method
a O_DIRECT
.
Con referencia a la documentación de MySQL:
Cuando los datos InnoDB y los archivos de registro se encuentran en una SAN, se ha encontrado que la fijación
innodb_flush_method
aO_DIRECT
puede degradar el rendimiento de simplesSELECT
declaraciones en un factor de tres.
Refiriéndose a MySQL Ver 2 y 3 de alto rendimiento, declaró que los desarrolladores de InnoDB encontraron errores con el uso innodb_flush_method=O_DSYNC
. O_SYNC
y O_DSYNC
son similares a fsync()
y fdatasync()
: O_SYNC
sincroniza datos y metadatos, mientras O_DSYNC
que solo sincroniza datos.
Si todo eso parecía una gran explicación sin ningún consejo, este es el consejo:
si usa un sistema operativo similar a Unix y su controlador RAID tiene un caché de escritura respaldado por batería, le recomendamos que lo use
O_DIRECT
. Si no, ya sea el predeterminado oO_DIRECT
probablemente será la mejor opción, dependiendo de su aplicación.
Al buscar en Google, obtuve este informe de referencia: en O_DSYNC
vsO_DIRECT
Informe de marca de banco: =================== Prueba transaccional compleja de fila 1B, 64 hilos * SAN O_DIRECT: solicitudes de lectura / escritura: 31560140 (8766.61 por segundo) * SAN O_DSYNC: solicitudes de lectura / escritura: 5179457 (1438.52 por segundo) * SAN fdatasync: solicitudes de lectura / escritura: 9445774 (2623.66 por segundo) * Disco local O_DIRECT: solicitudes de lectura / escritura: 3258595 (905.06 por segundo) * Disco local O_DSYNC: solicitudes de lectura / escritura: 3494632 (970,65 por segundo) * Fdatasync de disco local: solicitudes de lectura / escritura: 4223757 (1173.04 por segundo.
Sin embargo, O_DIRECT
deshabilita la memoria caché a nivel del sistema operativo, donde se puede deshabilitar el almacenamiento en caché doble que muestra un mejor rendimiento de E / S.
¿Es bueno ir en O_DIRECT
lugar de O_DSYNC
? Estas dos opciones son un poco confusas. ¿Qué opción puede mostrar un mejor rendimiento de E / S y una mejora en el rendimiento sin ningún impacto en los datos, lecturas / escrituras, especialmente en la producción? ¿Alguna mejor sugerencia basada en tu experiencia personal?
Pude ver la actualización de Rolando en la publicación :
Todavía hay una ligera confusión en ambos parámetros. Donde pude ver la mayoría de las plantillas de configuración de producción usando
O_DIRECT
, no he visto ninguna recomendaciónO_DSYNC
.
Sistema
- MySQL 5.1.51-enterprise-gpl-pro-log
- Red Hat Enterprise Linux Server versión 5.5
- DELL DRAC con Raid Controller que tiene una memoria caché de escritura de batería de 512 MB
- Controladores Dell PERC H700 con una unidad de batería de respaldo (BBU).
Información Adicional
mysql> muestra variables como 'innodb_thread_concurrency'; + --------------------------- + ------- + El | Nombre_variable | Valor | + --------------------------- + ------- + El | innodb_thread_concurrency | 96 | + --------------------------- + ------- + 1 fila en conjunto (0.00 seg) mysql> muestra variables como 'innodb_read_io_threads'; Conjunto vacío (0.00 seg) mysql> muestra variables como 'innodb_write_io_threads'; Conjunto vacío (0.00 seg)
Estamos utilizando el complemento predeterminado, así que publiqué la información del estado de InnoDB:
mysql> SELECCIONAR * DESDE complementos DONDE PLUGIN_NAME ME GUSTA '% innodb%' Y PLUGIN_TYPE ME GUSTA 'STORAGE ENGINE' \ G *************************** 1. fila ******************** ******* PLUGIN_NAME: InnoDB PLUGIN_VERSION: 1.0 PLUGIN_STATUS: ACTIVE PLUGIN_TYPE: MOTOR DE ALMACENAMIENTO PLUGIN_TYPE_VERSION: 50151.0 PLUGIN_LIBRARY: NULL PLUGIN_LIBRARY_VERSION: NULL PLUGIN_AUTHOR: Innobase OY PLUGIN_DESCRIPTION: admite transacciones, bloqueo de nivel de fila y claves externas PLUGIN_LICENSE: GPL 1 fila en conjunto (0.00 seg)
Respuestas:
El 21 de enero de 2009, Peter Zaitsev declaró lo siguiente en mysqlperformanceblog.com
Hasta el momento, no sé de nadie que haya tocado este tema.
O_DSYNC
como opción predeterminada no es una perspectiva atractiva, pero admite escrituras más rápidas que realmente no se verifican. Es por eso que hay tanta publicidad alrededorO_DIRECT
.Puedo decirle que no tiene instalado el complemento InnoDB. Con el complemento InnoDB, deben existir varias variables.
Debe actualizar InnoDB de una de dos maneras:
Una vez que lo haya hecho, puede mejorar InnoDB para
Aquí están mis publicaciones anteriores sobre la configuración que puede cambiar para esto:
Sep 12, 2011
: ¿Es posible hacer que MySQL use más de un núcleo?Sep 20, 2011
: Multi núcleos y rendimiento MySQLApr 26, 2012
: ¿El rendimiento de la CPU es relevante para un servidor de base de datos?Mar 16, 2012
: Uso de múltiples núcleos para consultas MySQL individuales en Debianfuente
Siempre tuve la impresión de que
O_DIRECT
es mejor para el rendimiento, ya que evita el doble almacenamiento en búfer. Además, siempre que tenga RAID de hardware con caché de escritura respaldada por batería. Por supuesto, también depende de la carga de trabajo, ya sea que LEA o ESCRIBA mucho.Además, pregunta para los expertos: hacer las llamadas adicionales a
fsync()
paraO_DIRECT
provocar una degradación notable en el rendimiento global, o es insignificante? Todavía tengo que ver los puntos de referencia que muestren esto.Además, tenga en cuenta que Percona ha habilitado la capacidad de configuración
innodb_flush_method=ALL_O_DIRECT
, que proporciona E / S directa no solo en los archivos de datos de InnoDB, sino también en los registros de transacciones de InnoDB al mismo tiempo.fuente