Früher dachte ich, dass Dateiänderungen direkt auf der Festplatte gespeichert werden, sobald ich die Datei schließe und mich entscheide, auf Speichern zu klicken / zu wählen. In einem kürzlich geführten Gespräch sagte mir jedoch ein Freund, dass dies normalerweise nicht der Fall ist. Das Betriebssystem (genauer gesagt, Linux-Systeme) speichert die Änderungen im Arbeitsspeicher und hat einen Daemon, der den Inhalt aus dem Arbeitsspeicher auf die Festplatte schreibt.
Er gab sogar das Beispiel externer Flash-Laufwerke an: Diese werden in das System eingebunden (in den Speicher kopiert), und manchmal kommt es zu Datenverlust, weil der Dämon den Inhalt noch nicht im Flash-Speicher gespeichert hat. Aus diesem Grund hängen wir Flash-Laufwerke aus.
Ich habe keine Kenntnisse über die Funktionsweise von Betriebssystemen und daher keine Ahnung, ob und unter welchen Umständen dies zutrifft. Meine Hauptfrage ist: Geschieht dies wie in Linux / Unix-Systemen (und möglicherweise anderen Betriebssystemen) beschrieben? Bedeutet dies beispielsweise, dass meine Änderungen höchstwahrscheinlich verloren gehen , wenn ich den Computer sofort nach dem Bearbeiten und Speichern einer Datei ausschalte ? Vielleicht hängt es vom Festplattentyp ab - traditionelle Festplatten im Vergleich zu Solid-State-Festplatten?
Die Frage bezieht sich speziell auf Dateisysteme, auf denen eine Festplatte zum Speichern der Informationen vorhanden ist, auch wenn Erläuterungen oder Vergleiche gut aufgenommen wurden.
quelle
sync
, und Anwendungen müssenflush
sicherstellen, dass Caches zurückgeschrieben werden. Selbst ein erfolgreicher Vorgangsync
garantiert jedoch nicht, dass auf die physische Festplatte zurückgeschrieben wird, sondern nur, dass die Kernel-Caches auf die Festplatte zurückgeschrieben werden, was zu Latenzzeiten führen kann in der Treiber- oder Festplattenhardware (z. B. Cache auf dem Laufwerk, den Sie verlieren)Antworten:
Sie könnten sein. Ich würde nicht "höchstwahrscheinlich" sagen, aber die Wahrscheinlichkeit hängt von vielen Dingen ab.
Eine einfache Möglichkeit, die Leistung beim Schreiben von Dateien zu steigern, besteht darin, dass das Betriebssystem nur die Daten zwischenspeichert, der Anwendung mitteilt, durch die geschrieben wurde, und den Schreibvorgang später ausführt. Dies ist besonders nützlich, wenn gleichzeitig andere Datenträgeraktivitäten stattfinden: Das Betriebssystem kann Lesevorgänge priorisieren und die Schreibvorgänge später ausführen. Es kann auch das Erfordernis eines tatsächlichen Schreibens vollständig beseitigen, z. B. in dem Fall, in dem eine temporäre Datei schnell danach entfernt wird.
Das Caching-Problem ist ausgeprägter, wenn der Speicher langsam ist. Das Kopieren von Dateien von einer schnellen SSD auf einen langsamen USB-Stick erfordert wahrscheinlich viel Schreib-Caching, da der USB-Stick einfach nicht mithalten kann. Ihr
cp
Befehl kehrt jedoch schneller zurück, sodass Sie weiterarbeiten und möglicherweise sogar die gerade kopierten Dateien bearbeiten können.Natürlich hat das Zwischenspeichern den Nachteil, dass einige Daten möglicherweise verloren gehen, bevor sie tatsächlich gespeichert werden. Der Benutzer ist verärgert, wenn sein Editor ihm mitteilt, dass der Schreibvorgang erfolgreich war, die Datei sich jedoch nicht auf der Festplatte befindet. Aus diesem Grund gibt es den
fsync()
Systemaufruf , der erst dann zurückkehren soll, wenn die Datei tatsächlich auf die Festplatte gelangt ist. Ihr Editor kann dies verwenden, um sicherzustellen, dass die Daten in Ordnung sind, bevor er dem Benutzer meldet, dass das Schreiben erfolgreich war.Ich sagte, "soll", da das Laufwerk selbst dem Betriebssystem die gleichen Lügen erzählen und sagen könnte, dass der Schreibvorgang abgeschlossen ist, während die Datei wirklich nur in einem flüchtigen Schreibcache innerhalb des Laufwerks vorhanden ist. Je nach Laufwerk führt möglicherweise kein Weg daran vorbei.
Neben
fsync()
gibt es auch diesync()
undsyncfs()
Anrufe System , das das System fragen , um sicherzustellen , dass alle systemweite schreibt oder alle Schreibvorgänge auf einem bestimmten Dateisystem der Festplatte getroffen haben. Mit dem Dienstprogrammsync
können diese aufgerufen werden.Dann gibt es noch das
O_DIRECT
Flag toopen()
, das "versuchen soll, Cache-Effekte der Ein- und Ausgabe von und zu dieser Datei zu minimieren". Das Entfernen von Caching verringert die Leistung, sodass dies hauptsächlich von Anwendungen (Datenbanken) verwendet wird, die ihr eigenes Caching durchführen und die Steuerung übernehmen möchten. (O_DIRECT
Nicht ohne Probleme, die Kommentare dazu in der Manpage sind etwas amüsant.)Was bei einem Stromausfall passiert, hängt auch vom Dateisystem ab. Es sind nicht nur die Dateidaten, um die Sie sich Sorgen machen sollten, sondern auch die Metadaten des Dateisystems. Die Dateidaten auf der Festplatte zu haben, ist nicht sehr nützlich, wenn Sie sie nicht finden können. Wenn Sie eine Datei nur auf eine größere Größe erweitern, müssen Sie neue Datenblöcke zuweisen und diese müssen an einer bestimmten Stelle markiert werden.
Wie ein Dateisystem mit Metadatenänderungen umgeht und in welcher Reihenfolge Metadaten und Daten geschrieben werden, ist sehr unterschiedlich. Zum Beispiel mit
ext4
, wenn Sie den Mount - Flag gesetztdata=journal
, dann alle Schreibvorgänge - auch Daten schreiben - durch die Zeitschrift gehen und ziemlich sicher sein sollte. Das bedeutet auch, dass sie zweimal geschrieben werden, sodass die Leistung abnimmt. Die Standardoptionen versuchen, die Schreibvorgänge so anzuordnen, dass sich die Daten auf dem Datenträger befinden, bevor die Metadaten aktualisiert werden. Andere Optionen oder andere Dateisysteme können besser oder schlechter sein. Ich werde nicht einmal eine umfassende Studie versuchen.In der Praxis sollte die Datei auf einem schwach geladenen System innerhalb weniger Sekunden auf dem Datenträger landen. Wenn Sie es mit einem Wechselspeicher zu tun haben, müssen Sie das Dateisystem aushängen, bevor Sie den Datenträger ziehen, um sicherzustellen, dass die Daten tatsächlich auf das Laufwerk gesendet werden und keine weiteren Aktivitäten stattfinden. (Oder lassen Sie das von Ihrer GUI-Umgebung für Sie erledigen.)
quelle
some cases where
Link sagt anscheinend nichts über solche Fälle aus. Stattdessen heißt es, dass es Probleme gab, als die Apps nicht verwendet wurdenfsync
. Oder sollte ich in den Kommentaren nachsehen, auf welche Fälle Sie hinweisen?sync
den Kernel auch direkt als System-Shell-Befehl verwenden, um alle Caches zu leeren.fsync()
nach dem Schreiben der Datei verwendet. Die Linux-Standardeinstellung für/proc/sys/vm/dirty_writeback_centisecs
ist 500 (5 Sekunden), und PowerTop empfiehlt, sie auf 1500 (15 Sekunden) festzulegen. ( kernel.org/doc/Documentation/sysctl/vm.txt ). Auf einem System mit geringer Auslastung lässt der Kernel es nur so lange im Page-Cache sitzenwrite()
, bis es auf die Festplatte geschrieben wird, um es für den Fall zu optimieren, dass es bald wieder gelöscht oder geändert wird.Es gibt eine äußerst einfache Möglichkeit, um zu beweisen, dass es nicht wahr sein kann, dass Dateibearbeitungen immer direkt auf der Festplatte gespeichert werden, nämlich die Tatsache, dass es Dateisysteme gibt, die gar nicht von einer Festplatte gesichert sind . Wenn ein Dateisystem nicht hat eine Festplatte an erster Stelle, dann ist es unmöglich , die Änderungen auf der Festplatte schreiben, immer .
Einige Beispiele sind:
tmpfs
, ein Dateisystem, das nur im RAM (genauer gesagt im Puffercache) vorhanden istramfs
, ein Dateisystem, das nur im RAM existiertsysfs
,procfs
,devfs
,shmfs
, ...)Aber selbst für festplattengesicherte Dateisysteme ist dies normalerweise nicht der Fall. Die Seite So beschädigen Sie eine SQLite-Datenbank enthält ein Kapitel mit dem Titel " Fehler beim Synchronisieren", in dem viele verschiedene Methoden beschrieben werden, mit denen Schreibvorgänge (in diesem Fall Festschreibungen an eine SQLite-Datenbank) möglicherweise nicht auf der Festplatte eingehen. In SQLite finden Sie auch ein Whitepaper, in dem die vielen Rahmen erläutert werden, durch die Sie springen müssen, um Atomic Commit in SQLite zu gewährleisten . (Beachten Sie, dass Atomic Write ein weitaus schwierigeres Problem ist als nur Write , aber natürlich ist das Schreiben auf die Festplatte ein Unterproblem des Atomic Writing, und Sie können auch in diesem Artikel viel über dieses Problem lernen.) In diesem Artikel gibt es eine Abschnitt über Dinge, die schief gehen können, der einen Unterabschnitt über enthältIncomplete Disk Flushes , die einige Beispiele für subtile Probleme aufzeigen , die möglicherweise verhindern, dass ein Schreibzugriff auf die Festplatte erfolgt (z. B. der Festplattencontroller, der meldet, dass er auf die Festplatte geschrieben wurde, obwohl dies nicht der Fall ist - ja, es gibt Festplattenhersteller, die dies tun. und es könnte sogar legal sein gemäß der ATA-Spezifikation, weil es in dieser Hinsicht mehrdeutig formuliert ist).
quelle
Es ist richtig, dass die meisten Betriebssysteme, einschließlich Unix, Linux und Windows, einen Schreibcache verwenden, um Vorgänge zu beschleunigen. Das bedeutet, dass das Ausschalten eines Computers ohne Herunterfahren eine schlechte Idee ist und zu Datenverlust führen kann. Das Gleiche gilt, wenn Sie einen USB-Speicher entfernen, bevor er entfernt werden kann.
Die meisten Systeme bieten auch die Möglichkeit, Schreibvorgänge synchron zu machen. Dies bedeutet, dass die Daten auf der Festplatte gespeichert werden, bevor eine Anwendung eine Erfolgsbestätigung erhält, und zwar auf Kosten der Verlangsamung.
Kurz gesagt, es gibt einen Grund, warum Sie Ihren Computer ordnungsgemäß herunterfahren und den USB-Speicher für das Entfernen vorbereiten sollten.
quelle
fsync()
Syscall von einem Programm aus erzwingen . Verwenden Sie in einer Shell einfach densync
Befehl.sync
die als No-Op implementiert wurden. Und selbst bei Dateisystemen, die ordnungsgemäß implementiert sindsync
, besteht immer noch das Problem, dass einige Festplatten-FirmwaresFLUSH CACHE
als "no-op" implementiert sind oder sofort von ihr zurückkehren und sie im Hintergrund ausführen.1. Flash-basierter Speicher
Wenn Sie die Wahl haben, sollten Sie nicht zulassen, dass der Flash-basierte Speicher ohne ein sauberes Herunterfahren an Leistung verliert.
Bei kostengünstigem Speicher wie SD-Karten können Sie damit rechnen, dass ganze Löschblöcke (mehrmals größer als 4 KB) verloren gehen und Daten verloren gehen, die zu verschiedenen Dateien oder wesentlichen Strukturen des Dateisystems gehören können.
Einige teure SSDs bieten möglicherweise bessere Garantien für Stromausfälle. Tests von Drittanbietern deuten jedoch darauf hin, dass viele teure SSDs dies nicht tun. Die Ebene, die Blöcke für den "Verschleißausgleich" neu abbildet, ist komplex und urheberrechtlich geschützt. Mögliche Fehler sind der Verlust aller Daten auf dem Laufwerk.
2017: https://dl.acm.org/citation.cfm?id=2992782&preflayout=flat
2013: https://www.usenix.org/system/files/conference/fast13/fast13-final80.pdf?wptouch_preview_theme=enabled
2. Festplatten drehen
Drehende Festplatten haben unterschiedliche Eigenschaften. Aus Gründen der Sicherheit und Einfachheit empfehle ich, davon auszugehen, dass sie die gleichen praktischen Unsicherheiten aufweisen wie flashbasierte Speicher.
Es sei denn, Sie haben konkrete Beweise, die Sie eindeutig nicht haben. Ich habe keine Vergleichszahlen für drehende Festplatten.
Eine Festplatte hinterlässt möglicherweise einen unvollständig geschriebenen Sektor mit einer schlechten Prüfsumme, was später zu einem netten Lesefehler führt. Allgemein gesagt wird dieser Ausfallmodus von Festplatten voll und ganz erwartet. native Linux-Dateisysteme sind darauf ausgelegt. Sie zielen darauf ab, den Vertrag
fsync()
angesichts dieser Art von Stromausfallfehler zu bewahren . (Wir möchten dies wirklich auf SSDs garantiert sehen).Ich bin mir jedoch nicht sicher, ob Linux-Dateisysteme dies in allen Fällen erreichen oder ob dies überhaupt möglich ist.
Der nächste Start nach diesem Fehlertyp erfordert möglicherweise eine Reparatur des Dateisystems. Da dies Linux ist, ist es möglich, dass die Dateisystemreparatur einige Fragen stellt, die Sie nicht verstehen. Dort können Sie nur Y drücken und hoffen, dass es sich von selbst regelt.
2.1 Wenn Sie nicht wissen, was der Vertrag mit fsync () ist
Der Vertrag fsync () ist sowohl eine Quelle für gute als auch für schlechte Nachrichten. Sie müssen die guten Nachrichten zuerst verstehen.
Gute Nachricht:
fsync()
Ist gut dokumentiert als die richtige Art, Dateidaten zu schreiben, zB wenn Sie auf "Speichern" klicken. Und es ist allgemein bekannt, dass z. B. Texteditoren vorhandene Dateien atomar ersetzen müssen, indem sie verwendenrename()
. Dies soll sicherstellen, dass Sie immer entweder die alte Datei behalten oder die neue Datei erhalten (diefsync()
vor dem Umbenennen bearbeitet wurde). Sie möchten nicht mit einer halbgeschriebenen Version der neuen Datei belassen werden.Schlechte Nachrichten: Seit vielen Jahren kann der Aufruf von fsync () auf dem beliebtesten Linux-Dateisystem dazu führen, dass das gesamte System einige zehn Sekunden lang hängen bleibt. Da Anwendungen nichts dagegen tun können, war es üblich, rename () ohne fsync () zu verwenden, was auf diesem Dateisystem relativ zuverlässig zu sein schien.
Daher gibt es Anwendungen, die fsync () nicht korrekt verwenden.
Die nächste Version dieses Dateisystems hat im Allgemeinen das Aufhängen von fsync () vermieden - zur gleichen Zeit, als es begann, sich auf die korrekte Verwendung von fsync () zu verlassen.
Das ist alles ziemlich schlimm. Das Verständnis dieser Geschichte wird wahrscheinlich nicht durch den abweisenden und beleidigenden Ton unterstützt, der von vielen der widersprüchlichen Kernel-Entwickler verwendet wurde.
Die aktuelle Auflösung ist das derzeit beliebteste Linux-Dateisystem
Standardmäßig wird das rename () -Muster unterstützt, ohne dass fsync () erforderlich ist.implementiert "Bug-for-Bug-Kompatibilität" mit der vorherigen Version. Dies kann mit der Mount-Option deaktiviert werdennoauto_da_alloc
.Dies ist kein vollständiger Schutz. Grundsätzlich wird die ausstehende E / A beim Umbenennen () gelöscht, es wird jedoch nicht gewartet, bis die E / A abgeschlossen ist, bevor die Umbenennung erfolgt. Dies ist jedoch viel besser als zB ein 60 Sekunden langes Gefahrenfenster! Siehe auch die Antwort auf Welche Dateisysteme benötigen fsync () zur Absturzsicherung, wenn eine vorhandene Datei durch rename () ersetzt wird?
Einige weniger beliebte Dateisysteme bieten keinen Schutz. XFS lehnt dies ab. Und UBIFS hat es auch nicht implementiert, anscheinend könnte es akzeptiert werden, erfordert aber viel Arbeit, um dies zu ermöglichen. Dieselbe Seite weist darauf hin, dass UBIFS mehrere andere "TODO" -Probleme in Bezug auf die Datenintegrität aufweist, einschließlich Stromausfall. UBIFS ist ein Dateisystem, das direkt im Flash-Speicher verwendet wird. Ich stelle mir vor, dass einige der Schwierigkeiten, die UBIFS mit Flash-Speichern anführt, für die SSD-Bugs relevant sein könnten.
quelle
Auf einem System mit geringer Auslastung lässt der Kernel neu geschriebene Dateidaten nach a etwa 30 Sekunden im Seiten-Cache
write()
, bevor sie auf die Festplatte geschrieben werden, um sie für den Fall zu optimieren, dass sie bald gelöscht oder erneut geändert werden.Die
dirty_expire_centisecs
Standardeinstellung von Linux ist 3000 (30 Sekunden) und steuert, wie lange es dauert , bis neu geschriebene Daten "verfallen". (Siehe https://lwn.net/Articles/322823/ ).Unter https://www.kernel.org/doc/Documentation/sysctl/vm.txt finden Sie weitere verwandte Tunables, und unter google finden Sie viele weitere. (zB google on
dirty_writeback_centisecs
).Die Linux-Standardeinstellung für
/proc/sys/vm/dirty_writeback_centisecs
ist 500 (5 Sekunden) , und PowerTop empfiehlt, sie auf 1500 (15 Sekunden) festzulegen, um den Stromverbrauch zu senken.Ein verzögertes Zurückschreiben gibt dem Kernel auch Zeit, um zu sehen, wie groß eine Datei sein wird, bevor mit dem Schreiben auf die Festplatte begonnen wird. Dateisysteme mit verzögerter Zuweisung (wie XFS und wahrscheinlich andere heutzutage) wählen nicht einmal, wo auf der Festplatte die Daten einer neu geschriebenen Datei abgelegt werden sollen, bis dies erforderlich ist, unabhängig von der Zuweisung von Speicherplatz für den Inode. Auf diese Weise wird die Fragmentierung verringert, indem beispielsweise vermieden wird, dass der Anfang einer großen Datei in einer Lücke von 1 Megabyte zwischen anderen Dateien liegt.
Wenn viele Daten geschrieben werden, kann das Zurückschreiben auf die Festplatte durch einen Schwellenwert für die Anzahl der fehlerhaften (noch nicht mit der Festplatte synchronisierten) Daten im Pagecache ausgelöst werden.
Wenn Sie nicht viel anderes tun, leuchtet die Aktivitätsanzeige Ihrer Festplatte für 5 (oder 15) Sekunden nicht auf, nachdem Sie auf Speichern in einer kleinen Datei geklickt haben.
Wenn Ihr Editor
fsync()
nach dem Schreiben der Datei verwendet wird, schreibt der Kernel diese unverzüglich auf die Festplatte. (Undfsync
wird nicht zurückkehren, bis die Daten tatsächlich auf die Festplatte gesendet wurden).Schreib - Caching innerhalb der Platte kann auch eine Sache sein, aber Platten normalerweise versuchen , ihren Schreib-Cache in dem permanenten Speicher so schnell wie möglich zu begehen, im Gegensatz zu Linux Seite-Cache - Algorithmen. Schreib-Cache-Speicher sind eher ein Speicherpuffer, um kleine Schreib-Bursts zu absorbieren, aber möglicherweise auch, um Schreibvorgänge zugunsten von Lesevorgängen zu verzögern und der Festplatten-Firmware Raum zu geben, um ein Suchmuster zu optimieren (z. B. zwei Schreib- oder Lesevorgänge in der Nähe ausführen, anstatt eines auszuführen) , dann weit weg suchen, dann zurück suchen.)
Auf einer sich drehenden (magnetischen) Platte können einige Suchverzögerungen von jeweils 7 bis 10 ms auftreten, bevor die Daten eines SATA-Schreibbefehls tatsächlich vor dem Ausschalten geschützt sind, wenn vor dem Schreiben Lese- / Schreibvorgänge anstehen. (Einige andere Antworten auf diese Frage gehen detaillierter auf Festplattenschreibcaches und Schreibbarrieren ein, die von Journalled FSes zur Vermeidung von Korruption verwendet werden können.)
quelle