Wie funktioniert der fsync-Systemaufruf in Linux?

8

Wenn der Schreibaufruf zurückkehrt, werden die Daten auf eine vom Kernel verwaltete Seite kopiert. Diese Seite kann Schreibvorgänge von mehreren Prozessen enthalten. Wenn also eine der Anwendungen einen fsync-Aufruf ausgibt, führt dies dazu, dass die gesamte Seite gespült wird, was bedeutet, dass auch andere Anwendungsdaten gelöscht werden, die Kosten jedoch von dem Prozess verursacht werden, der fsync aufruft. Ist das korrekt?

    
Jimm 21.12.2012, 18:40
quelle

2 Antworten

4

fsync arbeitet mit einer einzigen Datei. Es werden alle Änderungen gelöscht, die an dieser Datei vorgenommen wurden. Wenn mehrere Prozesse in eine einzelne Datei schreiben, wird der Prozess, der den fsync -Aufruf durchgeführt hat, angehalten, bis all die Änderungen auf die Festplatte geschrieben werden.

Dies ist komplizierter, wenn einige Journaling-Dateisysteme ins Spiel kommen. Beispielsweise sind ext3 und ext4 (in geringerem Umfang) mit dem Modus "ordered" erforderlich, um alle Änderungen an all der Dateien vor der fsync-Datei im Journal zu löschen.

Das heißt, wenn Programme in eine große Datenbank oder eine große Protokolldatei oder eine Videodatei geschrieben haben und Sie dann fsync eine zweizeilige Konfigurationsdatei haben, muss Ihr fsync auf all diese Megabytes an Daten warten geschrieben werden, bevor es zurückkehren kann.

Deshalb starte ich meinen ext4 im "Writeback" -Modus, der nach einem Absturz einige unangenehme Folgen haben kann, wie z. B. Dateien der richtigen Größe, die aber mit Nullen gefüllt sind. Aber im normalen Betrieb ist "Writeback" so viel schneller, dass ich denke, der Kompromiss ist es wert.

    
Zan Lynx 21.12.2012 19:09
quelle
0

Die Manpage gibt 'flushes to disk any data written to this file' an, die Dateimetadaten enthält.

Ich denke, Sie verwechseln das mit sync , das alle schmutzigen Seiten aus dem gesamten Cache auf die Festplatte schreibt. Dirty page == geänderte Daten. Und der Prozess muss darauf warten, dass all dies abgeschlossen ist. Wenn du mit Kosten meinst, warte, dann entstehen ja Kosten. Die Kernelzeit wird zur Ressourcennutzung des Prozesssystems hinzugefügt.

fsync verursacht auch Kosten und eine viel kleinere Kernel-Zeit als die Synchronisierung (normalerweise).

    
jim mcnamara 21.12.2012 18:51
quelle

Tags und Links