Articulo de referencia

sincronización (Unix)

La función `sync` es una llamada al sistema estándar en el sistema operativo Unix que transfiere todos los datos de los búferes del sistema de archivos del kernel a un almacenam...

La función `sync` es una llamada al sistema estándar en el sistema operativo Unix que transfiere todos los datos de los búferes del sistema de archivos del kernel a un almacenamiento no volátil ; es decir, datos cuya escritura se ha programado mediante llamadas al sistema de E/S de bajo nivel . Las capas de E/S de nivel superior, como `stdio`, pueden mantener sus propios búferes.

En C , la sync()llamada a la función se declara normalmente como void sync(void)en <unistd.h>. La llamada al sistema también está disponible a través de una utilidad de línea de comandos llamada sync , y funciones con nombres similares en otros lenguajes como Perl y Node.js (en el módulo fs).

La llamada al sistema relacionada fsync()confirma solo los datos almacenados en búfer relacionados con un descriptor de archivo especificado . [ 1 ]fdatasync() También está disponible para escribir solo los cambios realizados en los datos del archivo, y no necesariamente los metadatos relacionados con el archivo. [ 2 ]

Algunos sistemas Unix ejecutan una especie de demonio de vaciado o actualización , que llama a la función sync de forma regular. En algunos sistemas, el demonio cron se encarga de esto, y en Linux lo gestionaba el demonio pdflush , que fue reemplazado por una nueva implementación y finalmente eliminado del kernel de Linux en 2012. [ 3 ] Los búferes también se vacían cuando los sistemas de archivos se desmontan o se vuelven a montar en modo de solo lectura , [ 4 ] por ejemplo, antes del apagado del sistema.

Algunas aplicaciones, como LibreOffice , también utilizan la función de sincronización para guardar información de recuperación a intervalos regulares.

Uso de la base de datos

Para proporcionar una durabilidad adecuada , las bases de datos necesitan usar algún tipo de sincronización para asegurar que la información escrita se haya almacenado en un almacenamiento no volátil en lugar de simplemente almacenarse en una caché de escritura basada en memoria que se perdería si fallara la energía. PostgreSQL, por ejemplo, puede usar una variedad de llamadas de sincronización diferentes, incluidas fsync()y fdatasync(), [ 5 ] para que las confirmaciones sean duraderas. [ 6 ] Desafortunadamente, para cualquier cliente que escriba una serie de registros, un disco duro rotatorio solo puede confirmar una vez por rotación, lo que hace que en el mejor de los casos sean unos pocos cientos de dichas confirmaciones por segundo. [ 7 ] Por lo tanto, desactivar el requisito de fsync puede mejorar en gran medida el rendimiento de las confirmaciones, pero a costa de introducir potencialmente corrupción de la base de datos después de una caída.

Las bases de datos también utilizan archivos de registro de transacciones (normalmente mucho más pequeños que los archivos de datos principales) que contienen información sobre los cambios recientes, de modo que estos se pueden rehacer de forma fiable en caso de fallo del sistema; así, los archivos de datos principales se pueden sincronizar con menos frecuencia.

Informes y comprobación de errores

Para evitar cualquier pérdida de datos, fsync()se deben verificar los valores de retorno porque al realizar operaciones de E/S que son almacenadas en búfer por la biblioteca o el kernel, es posible que no se informen errores en el momento de usar la write()llamada al sistema o la fflush()llamada, ya que los datos pueden no escribirse en el almacenamiento no volátil, sino solo en la caché de página de memoria . Los errores de escrituras a menudo se informan durante las llamadas al sistema a fsync()o msync(). close()[ 8 ] Antes de 2018, el comportamiento de Linux fsync()en ciertas circunstancias no informaba el estado de error, [ 9 ] [ 10 ] el 23 de abril de 2018 se propuso un cambio de comportamiento . [ 11 ]

Controversias sobre el rendimiento

Semántica de caché a nivel de hardware

Los discos duros pueden usar por defecto su propia caché de escritura volátil para almacenar en búfer las escrituras, lo que mejora mucho el rendimiento, pero introduce la posibilidad de que se pierdan escrituras si "mienten" sobre cuándo han terminado de escribirse los datos. [ 12 ] Herramientas como hdparm -F le indicarán al controlador del disco duro que vacíe el búfer de caché de escritura en la unidad. El impacto en el rendimiento de desactivar el almacenamiento en caché es tan grande que incluso la comunidad de FreeBSD, normalmente conservadora, rechazó deshabilitar el almacenamiento en caché de escritura por defecto en FreeBSD 4.3. [ 13 ]

En SCSI y en SATA con Native Command Queuing (pero no en ATA simple, incluso con TCQ) el host puede especificar si desea ser notificado de la finalización cuando los datos llegan a los platos del disco o cuando llegan al búfer del disco (caché en la placa). Suponiendo una implementación de hardware correcta, esta característica permite que se utilice la caché en la placa del disco al tiempo que garantiza la semántica correcta para llamadas al sistema como fsync. [ 14 ] Esta característica de hardware se llama Acceso de Unidad Forzada (FUA) y permite la consistencia con menos sobrecarga que vaciar toda la caché como se hace para discos ATA (o SATA sin NCQ). [ 15 ] Aunque Linux habilitó NCQ alrededor de 2007, no habilitó SATA/NCQ FUA hasta 2012, citando la falta de soporte en las primeras unidades. [ 16 ] [ 17 ]

Uso en aplicaciones

Firefox 3.0, lanzado en 2008, introdujo fsyncllamadas al sistema que se descubrió que degradaban su rendimiento; la llamada se introdujo para garantizar la integridad de la base de datos SQLite integrada . [ 18 ] Más específicamente, el hilo de la interfaz de usuario llama a SQLite para cada nueva página visitada y la biblioteca llama a fsync. En el modo de ext3 data=ordered, que es una configuración bastante común en ese momento, llamar fsyncsignifica que se vacía toda la caché de escritura del sistema de archivos, lo que puede llevar mucho tiempo si la caché contiene muchas otras operaciones pendientes (por ejemplo, en medio de la copia de un archivo grande). [ 19 ]

Este evento inspiró muchas críticas contra el uso de fsync, alegando problemas de rendimiento, arranques innecesarios de HDD y/o la necesidad de solo atomicidad y no durabilidad. [ 20 ] El director técnico de la Linux Foundation, Theodore Ts'o, proporcionó un análisis del problema: Responde que no hay necesidad de "temer " cuando se usa correctamente, y enfatiza que es la única forma POSIX de solicitar que se escriban datos en almacenamiento no volátil. Rebate las tres críticas afirmando que (1) el impacto en el rendimiento debería ser mínimo en un caso de uso típico (descargar un archivo mientras se navega por la web), que no crea E/S adicionales (solo espera por ellas), y que Firefox se equivocó al realizar tantas escrituras en disco al navegar por una página web; (2) que el arranque podría evitarse mediante un ajuste del existente ; y (3) que "atomicidad en lugar de durabilidad" es una mala solución de seguridad en comparación con la creación de un hilo de E/S para ejecutar . [ 20 ]fsyncfsyncfsyncfsynclaptop_modefsync

Stewart Smith había hecho una presentación sobre el uso, el mal uso y el subuso de fsyncen aplicaciones justo el año anterior (2007). Aunque su charla se centró principalmente en prácticas perjudiciales para la integridad de los datos (y formas de cuidar tanto la velocidad como la seguridad), [ 21 ] la herramienta "eatmydata" para deshabilitar todas las llamadas de tipo síncrono para un programa terminó teniendo una distribución más amplia. [ 22 ] Se utiliza principalmente en tareas "desechables" donde la pérdida de datos es aceptable, [ 23 ] por ejemplo en un entorno temporal para acelerar las instalaciones de paquetes. [ 24 ]

Véase también

Referencias

  1. Especificación fsync
  2. Especificación fdatasync
  3. "RIP Pdflush [ LWN.net ] " .
  4. "mount - ¿Las llamadas umount se sincronizan para completar las escrituras pendientes?" . Unix & Linux Stack Exchange . Consultado el 2 de mayo de 2021 .
  5. Vondra, Tomas (2 de febrero de 2019). "PostgreSQL vs. fsync" . Osuosl Org . Archivado del original (mp4) el 10 de febrero de 2019. Recuperado el 10 de febrero de 2019 .
  6. Fiabilidad de PostgreSQL y el registro de escritura anticipada
  7. Optimización de la sincronización WAL de PostgreSQL Archivado el 25/11/2009 en Wayback Machine
  8. "Garantizar que los datos lleguen al disco [ LWN.net ] " .
  9. "La función fsync() de PostgreSQL sorprende [ LWN.net ] " .
  10. "Mejora del manejo de errores en la capa de bloques [ LWN.net ] " .
  11. "Informar siempre de un error de escritura una sola vez - Patchwork" . Archivado del original el 4 de mayo de 2018. Consultado el 3 de mayo de 2018 .
  12. ↑ ¿ Caché de escritura habilitada?
  13. Manual de FreeBSD — Discos de optimización
  14. Marshall Kirk McKusick . "Discos desde la perspectiva de un sistema de archivos - ACM Queue" . Queue.acm.org . Consultado el 11 de enero de 2014 .
  15. Gregory Smith (2010). PostgreSQL 9.0: Alto rendimiento . Packt Publishing Ltd. pág. 78. ISBN  978-1-84951-031-8.
  16. "Habilitación de FUA para unidades SATA (anteriormente Re: [ RFC ] [ PATCH ] libata: Habilitar la detección de FUA de discos SATA por defecto) (Linux SCSI)" .
  17. "Archivo del kernel de Linux: [ PATCH RFC ] libata: actualizaciones de FUA" .
  18. "Shaver » fsyncers y curveballs" . Archivado del original el 09-12-2012 . Recuperado el 15-10-2009 . 
  19. Mike Shaver :
    En algunas configuraciones de Linux bastante comunes, especialmente al usar el sistema de archivos ext3 en el modo "data=ordered", llamar a fsync no solo vacía los datos del archivo en el que se llama, sino también todos los datos almacenados en búfer para ese sistema de archivos. en "Asignación diferida y el problema de los archivos de longitud cero" .
  20. 1 2 "¡No temas a la sincronización de fotogramas!" .
  21. Smith, Stewart (2007). Eat my data: how everybody gets file IO wrong (PDF) . linux.conf.au.
  22. "eatmydata (1) desactiva de forma transparente fsync() y otras llamadas de sincronización de datos a disco" .
  23. "libeatmydata - ¡desactiva fsync y GUARDA!" . www.flamingspork.com .
  24. "Paquete: apt-eatmydata (1) - Deshabilita fsync y similares para las llamadas dpkg de APT" . packages.debian.org .
  • sync(8) - Página man de Linux
  • http://austingroupbugs.net/view.php?id=672
Obtenido de " https://en.wikipedia.org/w/index.php?title=Sync_(Unix)&oldid=1358692539 "