Synchronisation (UNIX)

Synchronisation ist ein Standard Systemanruf in dem Unix Betriebssystem, das alle Daten in der verpflichtet Kernel Dateisystem zu nicht flüchtig Lagerung Puffer, d.h. I/o Systemaufrufe. Höhere E/A-Schichten wie stdio kann eigene eigene Puffer beibehalten.

Als Funktion in C, das synchronisieren () Anruf wird normalerweise als als deklariert als als Hohlraumsynchronisation (void) in . Der Systemaufruf ist auch über a verfügbar Befehlszeile Nützlichkeit auch genannt Synchronisationund ähnlich benannte Funktionen in anderen Sprachen wie z. Perl und Node.js (im FS -Modul).

Der zugehörige Systemaufruf fsync () Verpflichtet nur die gepufferten Daten zu einem angegebenen Dateideskriptor.[1] fdatasync () ist auch verfügbar, um nur die Änderungen an den Daten in der Datei zu schreiben, und nicht unbedingt die zugehörigen Metadaten der Datei.[2]

Einige Unix -Systeme führen eine Art von einer Art aus spülen oder aktualisieren Dämon, was die nennt Synchronisation regelmäßig funktionieren. Auf einigen Systemen die Cron Daemon tut das und weiter Linux Es wurde vom PDFLUSH -Daemon bearbeitet, der durch eine neue Implementierung ersetzt und schließlich 2012 aus dem Linux -Kernel entfernt wurde.[3] Puffer werden auch gespült, wenn Dateisysteme sind unmontiert oder wieder aufgenommen schreibgeschützt,[4] Zum Beispiel vor dem Herunterfahren des Systems.

Datenbank Verwendung

Um angemessen bereitzustellen HaltbarkeitDatenbanken müssen eine Synchronisierung verwenden, um sicherzustellen, dass die geschriebenen Informationen es geschafft haben Nichtflüchtiger Speicher Anstatt nur in einem Speicher-basierten Schreibcache gespeichert zu werden, würde dies verloren gehen, wenn der Strom fehlschlägt. PostgreSQL Zum Beispiel kann eine Vielzahl verschiedener Synchronisierungsaufrufe verwendet werden, einschließlich fsync () und fdatasync (),[5] Damit Commits langlebig sind.[6] Leider kann für jeden einzelnen Kunden, der eine Reihe von Datensätzen schreiben, eine rotierende Festplatte nur einmal pro Rotation verpflichten, was bestenfalls ein paar hundert solcher Commits pro Sekunde sorgt.[7] Das Ausschalten der FSYNC -Anforderung kann daher die Leistungsleistung erheblich verbessern, aber auf Kosten der potenziellen Einführung der Datenbankversorgung nach einem Absturz.

Datenbanken werden ebenfalls verwendet Transaktionsprotokoll Dateien (in der Regel viel kleiner als die Hauptdatendateien), die Informationen zu jüngsten Änderungen haben, sodass Änderungen im Falle eines Absturzes zuverlässig reduziert werden können. Dann können die Hauptdatendateien seltener synchronisiert werden.

Fehlerberichterstattung und Überprüfung

Um Datenverlust -Return -Werte von zu vermeiden fsync () sollte überprüft werden, da bei der Durchführung von E/A -Operationen, die von der Bibliothek oder dem Kernel gepuffert werden, Fehler zum Zeitpunkt der Verwendung der Verwendung möglicherweise nicht gemeldet werden schreiben() Systemanruf oder der fflush () Rufen Sie an, da die Daten möglicherweise nicht in den nichtflüchtigen Speicher geschrieben werden, sondern nur in den Speicher geschrieben werden Seitencache. Fehler von Schreibvorgängen werden stattdessen häufig bei Systemaufrufen angegeben fsync (), msync () oder nah dran().[8] Vor 2018, Linux's fsync () Das Verhalten unter bestimmten Umständen konnte den Fehlerstatus nicht melden,[9][10] Das Änderungsverhalten wurde am 23. April 2018 vorgeschlagen.[11]

Leistungskontroversen

Festplatten können standardmäßig ihren eigenen volatilen Schreibcache zu Puffer -Schreibvorgängen verwenden, was die Leistung erheblich verbessert und gleichzeitig ein Potenzial für verlorene Schreibvorgänge einführt.[12] Werkzeuge wie HDParm -F weist den HDD-Controller an, den On-T-Drive-Schreibcache-Puffer zu spülen. Die Leistungseinflüsse des Ausschaltens ist so groß, dass selbst die normalerweise konservativen Freebsd Die Community lehnte die Deaktivierung des Schreibens von Caching standardmäßig in FreeBSD 4.3 ab.[13]

Im Scsi und in Sata mit Native Command Queuing (Aber nicht in einfachem ATA, selbst mit TCQ) Der Host kann angeben, ob er über die Fertigstellung informiert werden möchte, wenn die Daten auf die Platten der Festplatten trifft oder wenn er auf den Puffer der Festplatte (in Bord-Cache) trifft. Unter der Annahme einer korrekten Hardware-Implementierung ermöglicht diese Funktion, dass der Innen-Cache der Datenträger verwendet wird, während die korrekte Semantik für Systemaufrufe wie die Gewährleistung der Gewährleistung von Systemen verwendet wird FSYNC.[14] Diese Hardware -Funktion heißt Zugang zur Krafteinheit (FUA) und es ermöglicht eine Konsistenz mit weniger Overhead, als den gesamten Cache wie für ATA- (oder SATA-NICHT-NCQ) -Scheisen zu spülen.[15] Obwohl Linux NCQ um 2007 aktiviert hat, ermöglichte es SATA/NCQ FUA erst 2012, wobei er in den frühen Laufwerken mangelnde Unterstützung zitierte.[16][17]

Firefox 3.0, das 2008 veröffentlicht wurde, eingeführt FSYNC Systemanrufe, die seine Leistung beeinträchtigen; Der Anruf wurde eingeführt, um die Integrität des Eingebetteten zu gewährleisten Sqlite Datenbank.[18] Linux Foundation Chief Technical Officer Theodore Ts'o Behauptungen, es besteht keine Notwendigkeit, "FSYNC zu fürchten", und dass die wahre Ursache für Firefox 3 die übermäßige Verwendung von ist FSYNC.[19] Er räumt jedoch auch ein (zitieren Mike Rasierer) das

Auf einigen eher häufigen Linux -Konfigurationen, insbesondere mit der ext3 Dateisystem im Modus "Data = Ordered" und das Aufrufen von FSYNC spülen nicht nur die Daten für die Datei, die er aufgerufen ist, sondern auch auf allen gepufferten Daten für dieses Dateisystem.[20]

Siehe auch

Verweise

  1. ^ FSYNC -Spezifikation
  2. ^ Fdatasync -Spezifikation
  3. ^ "R.I.P. PDFLUSH [lwn.net]".
  4. ^ "Mount - Ruft Umount synchronisiert an, um alle anstehenden Schreibvorgänge abzuschließen". Unix & Linux Stack Exchange. Abgerufen 2021-05-02.
  5. ^ Vondra, Tomas (2. Februar 2019). "PostgreSQL vs. Fsync". Osuosl org. Archiviert von das Original (MP4) am 10. Februar 2019. Abgerufen 10. Februar 2019.
  6. ^ PostgreSQL Zuverlässigkeit und das Schreibbetriebsprotokoll
  7. ^ Tuning postgresql Wal -Synchronisation Archiviert 2009-11-25 bei der Wayback -Maschine
  8. ^ "Sicherstellen, dass Daten die Festplatte erreicht [lwn.net]".
  9. ^ "PostgreSQLs FSYNC () Überraschung [lwn.net]".
  10. ^ "Verbesserte Blockschichtfehlerhandhabung [lwn.net]".
  11. ^ "Archivierte Kopie". Archiviert von das Original Am 2018-05-04. Abgerufen 2018-05-03.{{}}: CS1 Wartung: Archiviertes Kopie als Titel (Link)
  12. ^ Write-Cache aktiviert?
  13. ^ FreeBSD -Handbuch - Tuning -Scheiben
  14. ^ Marshall Kirk McKusick. "Festplatten aus der Perspektive eines Dateisystems - ACM -Warteschlange".Queue.acm.org. Abgerufen 2014-01-11.
  15. ^ Gregory Smith (2010). PostgreSQL 9.0: Hochleistungs. Packt Publishing Ltd. p. 78. ISBN 978-1-84951-031-8.
  16. ^ "Aktivieren Sie FUA für SATA -Laufwerke (wurde Re: [RFC] [Patch] Libata: Aktivieren Sie die SATA -Festplattenfua -Erkennung auf Standard) (Linux scsi)".
  17. ^ "Linux-Kernel-Archiv: [Patch RFC] Libata: FUA-Updates".
  18. ^ "Rasierer» Fsyncer und Curveballs ".
  19. ^ "Fürchte dich nicht vor der FSYNC!".
  20. ^ "Verzögerte Zuordnung und das Problem der Datei mit Nulllängen" ".

Externe Links