Permítanme comenzar admitiendo que soy muy ignorante del funcionamiento interno de los discos duros. Entonces, cuando leí el manual de la variable innodb_flush_method , me confundió. ¿Puedo obtener una explicación en términos simples sobre la diferencia en O_DSYNC y O_DIRECT, y cómo saber si se trata de un problema de rendimiento en un servidor de base de datos.
Algunas estadísticas en mi configuración: Mac OSX 10.6 (kernel de 32 bits, ya que la arquitectura está desactualizada) ejecutando MySQL 5.1.49-64bit (esperando que me permita usar la memoria). 8 GB de RAM, ~ 6 GB de datos / índices innodb.
Respuestas:
Aquí hay una explicación sobre cómo
fdatasync()
funciona vs cómofsync()
funcionafdatasync()
vacía todos los almacenamientos intermedios de datos de un archivo en el disco (antes de que vuelva la llamada al sistema). Se parecefsync()
pero no es necesario actualizar los metadatos, como el tiempo de acceso. Las aplicaciones que acceden a bases de datos o archivos de registro a menudo escriben un pequeño fragmento de datos (por ejemplo, una línea en un archivo de registro) y luego llaman defsync()
inmediato para asegurarse de que los datos escritos se almacenan físicamente en el disco duro. Desafortunadamente,fsync()
siempre iniciará dos operaciones de escrituraSi el tiempo de modificación no es parte del concepto de transacción,
fdatasync()
puede usarse para evitar operaciones innecesarias de escritura en disco de inodo.En inglés,
O_DSYNC
es más rápido queO_DIRECT
desde queO_DIRECT
llamafsync()
dos veces (una para registros y otra para datos) yfsync()
verifica la escritura de datos a través de dos operaciones de escritura. UsandoO_DSYNC
llamadasfdatsync()
yfsync()
. Se puede considerarfdatasync()
como hacer un asíncronofsync()
(no verificar datos).Mirando los números,
O_DSYNC
realiza cuatro operaciones de escritura, dos de las cuales se verifican, mientrasfsync()
que cuatro operaciones de escritura, todas verificadas posteriormente.CONCLUSIÓN
O_DSYNC
O_DIRECT
O_DIRECT
Espero que esta respuesta ayude, y espero no haber empeorado las cosas para ti.
fuente
This means that in principal, fdatasync can execute faster than fsync because it needs to force only one disk write instead of two. However, in current versions of Linux, these two system calls actually do the same thing, both updating the file's modification time.
en el momento en que escribí mi publicación hace 3.5 años, era cierto, especialmente con versiones anteriores de Linux.The related system call fsync() commits just the buffered data relating to a specified file descriptor. fdatasync() is also available to write out just the changes made to the data in the file, and not necessarily the file's related metadata.
(Esa Wiki se actualizó por última vez el 28 de julio de 2014).