Aquí hay una explicación sobre cómo fdatasync()
funciona vs cómo fsync()
funciona
fdatasync()
vacía todos los almacenamientos intermedios de datos de un archivo en el disco (antes de que vuelva la llamada al sistema). Se parece fsync()
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 de fsync()
inmediato para asegurarse de que los datos escritos se almacenan físicamente en el disco duro. Desafortunadamente, fsync()
siempre iniciará dos operaciones de escritura
- una operación de escritura para los datos recién escritos
- Una operación de escritura para actualizar el tiempo de modificación almacenado en el inodo
Si 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 que O_DIRECT
desde que O_DIRECT
llama fsync()
dos veces (una para registros y otra para datos) y fsync()
verifica la escritura de datos a través de dos operaciones de escritura. Usando O_DSYNC
llamadas fdatsync()
y fsync()
. Se puede considerar fdatasync()
como hacer un asíncrono fsync()
(no verificar datos).
Mirando los números, O_DSYNC
realiza cuatro operaciones de escritura, dos de las cuales se verifican, mientras fsync()
que cuatro operaciones de escritura, todas verificadas posteriormente.
CONCLUSIÓN
O_DSYNC
- más rápido que
O_DIRECT
- Los datos pueden o no ser consistentes debido a la latencia o un bloqueo absoluto
O_DIRECT
- mas estable
- datos consistentes
- naturalmente más lento
Espero que esta respuesta ayude, y espero no haber empeorado las cosas para ti.