Pregunta

Vamos a decir que estamos construyendo un sistema de almacenamiento de diario / escritura anticipada-registro. Se puede simplemente poner en práctica esto (para cada transacción) añadiendo los datos (con escritura (2)), añadiendo una confirmación marcador, y luego fsync-ing?

El escenario a considerar es si lo hace un gran conjunto de operaciones de escritura en este registro a continuación se fsync, y hay un fallo durante el fsync . Son los punteros de inodos directa / indirecta de bloque vacían sólo después de que todos los bloques de datos se vacían, o hay ninguna garantía de que los bloques se está volcando con el fin? En este último caso, a continuación, durante la recuperación, si usted ve una confirmación marcador al final del archivo, no se puede confiar en que los datos entre éste y el anterior se comprometen marcador es significativa. Por lo tanto usted tiene que depender de otro mecanismo (que implica al menos otra fsync) para determinar qué punto del archivo de registro es consistente (por ejemplo, la escritura / fsyncing los datos, a continuación, escribiendo / fsyncing el marcador de los cambios).

Si se hace una diferencia, preguntándose principalmente sobre ext3 / ext4, según el contexto.

¿Fue útil?

Solución

Tenga en cuenta que fsync y fdatasync sistemas operativos de Mac Mac y son incorrectos por defecto. Windows es correcta por defecto, pero puede emular Linux con fines de referencia.

Además, los problemas fdatasync discos múltiples escribe si agrega al final de un archivo, ya que tiene que actualizar el nodo-i archivo con la nueva longitud. Si usted quiere tener una escritura por cometer, lo mejor es comprobar la validez de asignar espacio de registro, almacenar un CRC de las entradas de registro en el marcador de confirmación, y emitir una sola fdatasync () durante la confirmación. De esa manera, no importa la cantidad del / de reordenación de hardware del sistema operativo detrás de la espalda, usted puede encontrar un prefijo del registro que realmente golpeó disco.

Si desea utilizar el registro para las confirmaciones duraderos o de escritura por delante, las cosas se ponen más difícil, ya que se necesita para asegurarse de que realmente funciona fsync. Bajo Linux, tendrá que desactivar la caché de escritura en disco con hdparm, o montar la partición con el sistema de barrera a la verdad. [Editar: mi error, no parece barrera para dar la semántica correcta. SATA y SCSI introducen una serie de primitivas, como las barreras de escritura y cola de comandos nativos, que hacen posible que los sistemas operativos para exportar primitivas que permiten el registro de escritura anticipada. De lo que puedo decir de páginas de manual y en línea, Linux sólo expone estos desarrolladores de sistemas de ficheros, no al espacio de usuario.]

Paradójicamente, la desactivación de la caché de escritura de disco a veces conduce a un mejor rendimiento, ya que se obtiene un mayor control sobre la programación de escritura en el espacio de usuario; Si las colas de disco hasta un montón de peticiones de escritura síncronos, se termina la exposición de los picos de latencia extrañas a la aplicación. Desactivación de caché de escritura evita que esto suceda.

Por último, los sistemas reales utilizan grupo cometió, y hacen <1 sincronización de escritura por cometer con cargas de trabajo simultáneas.

Otros consejos

No hay ninguna garantía sobre el orden en el que los bloques se vacían en el disco. En estos días, incluso la propia unidad puede cambiar el orden de los bloques en su camino hacia los platos.

Si desea aplicar pedido, es necesario al menos fdatasync() entre las escrituras que usted desee que se ordene. Todas las promesas de sincronización es que un cuando vuelve de almacenamiento, todo lo escrito antes de que la sincronización ha golpeado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top