Welche Philosophie steckt hinter der Verzögerung beim Schreiben von Daten auf die Festplatte?

72

Unter Linux bedeutet die vollständige Ausführung eines Befehls wie cpoder ddnicht, dass die Daten auf das Gerät geschrieben wurden. Man muss zum Beispiel syncdie Funktion "Sicher entfernen" oder "Auswerfen" auf dem Laufwerk aufrufen oder aufrufen.

Welche Philosophie steckt hinter einem solchen Ansatz? Warum werden die Daten nicht sofort geschrieben? Besteht keine Gefahr, dass das Schreiben aufgrund eines E / A-Fehlers fehlschlägt?

marmistrz
quelle
16
Denken Sie daran, dass die Systemaufrufe zum Lesen und Schreiben jeweils mit einem Byte arbeiten können, aber Festplattenlaufwerke nur Blöcke mit fester Größe lesen oder schreiben können. Der Overhead für Byte-I / O-Vorgänge wäre ohne Pufferung nicht tolerierbar. Mit Pufferung ist es erträglich.
Jonathan Leffler

Antworten:

47

Welche Philosophie steckt hinter einem solchen Ansatz?

Effizienz (bessere Nutzung der Datenträgereigenschaften) und Leistung (ermöglicht es der Anwendung, unmittelbar nach einem Schreibvorgang fortzufahren).

Warum werden die Daten nicht sofort geschrieben?

Der Hauptvorteil ist, dass das Betriebssystem zusammenhängende Schreibvorgänge neu anordnen und zusammenführen kann, um die Bandbreitennutzung zu verbessern (weniger Vorgänge und weniger Suchvorgänge). Festplatten erzielen eine bessere Leistung, wenn eine kleine Anzahl großer Vorgänge angefordert wird, während Anwendungen eher eine große Anzahl kleiner Vorgänge benötigen. Eine weitere klare Optimierung ist, dass das Betriebssystem auch alle bis auf den letzten Schreibvorgang entfernen kann, wenn derselbe Block in kurzer Zeit mehrmals geschrieben wurde, oder sogar einige Schreibvorgänge gemeinsam entfernen kann, wenn die betroffene Datei in der Zwischenzeit entfernt wurde.

Diese asynchronen Schreibvorgänge werden ausgeführt, nachdem der writeSystemaufruf zurückgegeben wurde. Dies ist der zweite und am meisten sichtbare Vorteil für den Benutzer. Asynchrone Schreibvorgänge beschleunigen die Anwendungen, da sie ihre Arbeit fortsetzen können, ohne darauf zu warten, dass sich die Daten tatsächlich auf der Festplatte befinden. Die gleiche Art des Pufferns / Zwischenspeicherns wird auch für Leseoperationen implementiert, bei denen kürzlich oder häufig gelesene Blöcke im Speicher verbleiben, anstatt erneut von der Platte gelesen zu werden.

Besteht keine Gefahr, dass das Schreiben aufgrund eines E / A-Fehlers fehlschlägt?

Nicht unbedingt. Das hängt vom verwendeten Dateisystem und der vorhandenen Redundanz ab. Ein E / A-Fehler ist möglicherweise harmlos, wenn die Daten an anderer Stelle gespeichert werden können. Moderne Dateisysteme wie ZFS heilen selbst fehlerhafte Festplattenblöcke. Beachten Sie auch, dass E / A-Fehler moderne Betriebssysteme nicht zum Absturz bringen. Wenn sie während des Datenzugriffs auftreten, werden sie einfach an die betroffene Anwendung gemeldet. Wenn sie während des strukturellen Metadatenzugriffs auftreten und das Dateisystem gefährden, wird es möglicherweise schreibgeschützt erneut bereitgestellt oder für den Zugriff gesperrt.

Bei einem Betriebssystemabsturz, einem Stromausfall oder einem Hardwarefehler besteht ebenfalls ein geringes Risiko für Datenverluste. Dies ist der Grund, warum Anwendungen, die 100% ig sicher sein müssen, dass sich die Daten auf der Festplatte befinden (z. B. Datenbanken / Finanz-Apps), weniger effizient, aber sicherer synchron schreiben. Um die Auswirkungen auf die Leistung zu verringern, verwenden viele Anwendungen immer noch asynchrone Schreibvorgänge, synchronisieren diese jedoch schließlich, wenn der Benutzer eine Datei explizit speichert (z. B. vim, Textverarbeitungsprogramme).

Auf der anderen Seite braucht und kümmert sich eine sehr große Mehrheit der Benutzer und Anwendungen nicht um die Sicherheit, die synchrone Schreibvorgänge bieten. Wenn es zu einem Absturz oder Stromausfall kommt, besteht das einzige Risiko darin, die letzten 30 Sekunden der Daten im schlimmsten Fall zu verlieren. Sofern es sich nicht um eine Finanztransaktion oder Ähnliches handelt, die einen Zeitaufwand von mehr als 30 Sekunden bedeuten würde, lässt der enorme Leistungszuwachs (der keine Illusion, sondern sehr real ist), dass asynchrone Schreibvorgänge das Risiko weitestgehend übertreffen.

Schließlich reichen synchrone Schreibvorgänge nicht aus, um die geschriebenen Daten zu schützen. Soll Ihre Anwendung wirklich sicherstellen, dass ihre Daten nicht verloren gehen, was auch immer passiert, muss eine Datenreplikation auf mehreren Festplatten und an mehreren geografischen Standorten eingerichtet werden, um Katastrophen wie Feuer, Überschwemmungen usw. zu widerstehen.

jlliagre
quelle
Überlegen Sie neben den Kosten, ob etwas unternommen wurde, das von der Speicherung der Daten abhängt. Wenn ich meinen Roman abtippe, nacheinander spare und durch einen Stromausfall 30 Sekunden Arbeit verliere, erreiche ich unabhängig von den 30 Sekunden einen Zustand, der während des Schreibvorgangs tatsächlich eingetreten ist , und ich kann von dort aus neu starten. Wenn ich dagegen auf "Speichern" klicke und dann etwas von meiner Papier-ToDo-Liste auf meinem Schreibtisch streiche, stelle ich bei der Wiederherstellung eine Inkonsistenz zwischen meiner Festplatte und meinem Papier fest. Dies ist im Allgemeinen schwieriger wieder aufzunehmen von ...
Steve Jessop
1
... als normaler Benutzer möchte ich das Dateisystem möglicherweise synchronisieren, bevor ich "Roman fertig schreiben" von meiner Aufgabenliste streife, um sicherzustellen, dass ich nicht glaube, dass ich etwas getan habe, das tatsächlich fehlschlägt. Und deshalb brauchen Datenbanken und dergleichen synchrone Schreibvorgänge: Auch wenn sie Daten verlieren, müssen sie unbedingt konsistent bleiben.
Steve Jessop
1
@SteveJessop Ich stimme Ihrem Beispiel zu, aber ich würde nicht erwarten, dass ein gelegentlicher Benutzer manuell synchronisiert. Wenn der Editor, der zum Schreiben des kostbaren Romans verwendet wurde, beim Speichern des Dokuments nicht fsync oder ähnliches aufruft, muss dieser Fehler behoben werden, z . B. bugs.launchpad.net/ubuntu/+source/libreoffice/+bug/817326 . Ich würde vi (vim) verwenden, um meine zu schreiben, vim ruft standardmäßig fsync bei save auf.
Juli
59

Es verleiht Programmen, die nicht warten müssen, bis ein Schreibvorgang abgeschlossen ist, eine Illusion von Geschwindigkeit. Mounten Sie Ihre Dateisysteme im Synchronisationsmodus (der Ihnen sofortiges Schreiben ermöglicht) und sehen Sie, wie langsam alles ist.

Manchmal existieren Dateien nur vorübergehend ... ein Programm erledigt einige Arbeiten und löscht die Datei sofort, nachdem die Arbeit erledigt ist. Wenn Sie diese Schreibvorgänge verzögert haben, können Sie davonkommen, dass Sie sie noch nie geschrieben haben.

Besteht keine Gefahr, dass das Schreiben aufgrund eines E / A-Fehlers fehlschlägt?

Oh, absolut. In einem solchen Fall wechselt normalerweise das gesamte Dateisystem in den Nur-Lese-Modus, und alles ist schrecklich. Dies ist jedoch selten der Fall, und es macht keinen Sinn, die Leistungsvorteile im Allgemeinen zu vernachlässigen.

Frostschutz
quelle
Bestimmte Festplatten-Controller verfügen über eine Batteriesicherung, sodass bei einem Stromausfall nicht festgeschriebene Daten auf dem Controller gespeichert bleiben, bis die Stromversorgung wiederhergestellt wird. Dies ermöglicht den Einsatz in Datenbankanwendungen, bei denen der Verlust von Daten keine Option ist.
Strattonn
Linux speichert Daten, die noch nicht in den Arbeitsspeicher geschrieben wurden, nicht auf die Festplatte. Die Festplatte hat auch einen eigenen Cache.
Barafu Albino
Es wäre sehr praktisch, wenn Dateien, die von einem Prozess geöffnet wurden, beim Schließen des Prozesses synchronisiert würden. Dies würde den Prozess selbst nicht beeinflussen, aber es würde Shell-Skripte und ähnliches vereinfachen (die jetzt ein ganzes Dateisystem synchronisieren müssen)
MSalters
14
Das ist mehr als eine Illusion. Asynchrone Schreibvorgänge verbessern die Gesamtleistung von Anwendungen.
Juli
4
@frostschutz: Über die nur temporär vorhandenen Dateien hinaus gibt es auch die Tatsache, dass einige Dateibereiche immer wieder neu geschrieben werden.
Matthieu M.
26

Asynchrone, gepufferte E / A wurden vor Linux und sogar vor Unix verwendet. Unix hatte es, und so haben alle seine Ableger.

Folgendes haben Ritchie und Thompson in ihrem CACM-Artikel The UNIX Time-Sharing System geschrieben :

Für den Benutzer scheinen sowohl das Lesen als auch das Schreiben von Dateien synchron und ungepuffert zu sein. Das heißt, unmittelbar nach der Rückkehr von einem Leseaufruf sind die Daten verfügbar, und umgekehrt kann der Arbeitsbereich des Benutzers nach einem Schreibvorgang wiederverwendet werden. Tatsächlich unterhält das System einen ziemlich komplizierten Puffermechanismus, der die Anzahl der I / O-Operationen, die für den Zugriff auf eine Datei erforderlich sind, erheblich reduziert.


In Ihrer Frage haben Sie auch geschrieben:

Besteht keine Gefahr, dass das Schreiben aufgrund eines E / A-Fehlers fehlschlägt?

Ja, der Schreibvorgang kann fehlschlagen und das Programm weiß möglicherweise nie davon. Obwohl dies nie gut ist, können die Auswirkungen in Fällen minimiert werden, in denen ein E / A-Fehler zu einer Systempanik führt (auf einigen Betriebssystemen ist dies konfigurierbar). Anstatt in Panik zu geraten, kann das System weiterhin ausgeführt werden, das betroffene Dateisystem jedoch nicht gemountet oder nur lesbar gemountet). Benutzer können dann benachrichtigt werden, dass die Daten in diesem Dateisystem verdächtig sind. Außerdem kann ein Festplattenlaufwerk proaktiv überwacht werden, um festzustellen, ob die Liste der gewachsenen Fehler schnell ansteigt. Dies ist ein Hinweis darauf, dass das Laufwerk ausfällt.

BSD fügte den fsyncSystemaufruf hinzu , damit ein Programm sicher sein konnte, dass seine Dateidaten vollständig auf die Festplatte geschrieben wurden, bevor es fortfuhr, und nachfolgende Unix-Systeme haben Optionen zum Ausführen synchroner Schreibvorgänge bereitgestellt. GNU dd hat eine Option conv=fsync, um sicherzustellen, dass alle Daten geschrieben wurden, bevor der Befehl beendet wird. Dies ist praktisch, wenn Sie auf langsame austauschbare Flash-Laufwerke schreiben, bei denen das Auslesen gepufferter Daten einige Minuten dauern kann.

Eine andere Ursache für Dateibeschädigung ist ein plötzliches Herunterfahren des Systems, beispielsweise aufgrund eines Stromausfalls. Nahezu alle aktuellen Systeme unterstützen ein Clean / Dirty- Flag in ihren Dateisystemen. Das Flag wird auf " Bereinigen" gesetzt, wenn keine Daten mehr ausgeschrieben werden müssen und das Dateisystem im Begriff ist, die Bereitstellung aufzuheben, normalerweise während des Herunterfahrens des Systems oder durch manuellen Aufruf umount. Systeme werden normalerweise fsckbeim Neustart ausgeführt, wenn sie feststellen, dass Dateisysteme nicht ordnungsgemäß heruntergefahren wurden.

Mark Plotnick
quelle
Angenommen, wir kopieren Musik von der Festplatte auf ein externes Laufwerk. Es kann vorkommen, dass das externe Laufwerk beschädigt ist und das Schreiben fehlschlägt. Dies würde nicht dazu führen, dass ein Programm mit fehlerhaften Daten ausgeführt wird. Und es scheint ein Overkill zu sein, bei einer ausgefallenen E / A auf einem externen Gerät in Panik zu geraten.
Marmistrz
Guter Punkt. Ich werde meine Antwort ändern.
Mark Plotnick
15

Viele gute Antworten, aber lassen Sie mich noch eines hinzufügen ... Denken Sie daran, dass Unix ein System mit mehreren Prozessen und mehreren Benutzern ist, so dass möglicherweise viele Benutzer versuchen würden, Dateioperationen (insbesondere Schreibvorgänge) an (fast) dem auszuführen gleiche Zeit. Bei alten langsamen Festplatten - möglicherweise über das Netzwerk gemountet - würde dies nicht nur Zeit in Anspruch nehmen (auf die die Programme im Grunde blockieren würden und die Benutzer warten müssten), sondern auch eine Menge Bewegung des Lese- / Schreibkopfs verursachen Scheibe hin und her.

Stattdessen wurden die Dateien, die darauf warteten, geschrieben zu werden, eine Weile im Speicher aufbewahrt und danach sortiert, wo sie auf der Festplatte landen sollten ... und wann der Puffer voll war - oder der Disk-Sync-Daemon auf das gewartet hatte erforderliche Anzahl von Sekunden (ich glaube, es waren normalerweise etwa 30 Sekunden) - der gesamte Puffer wurde "in der richtigen Reihenfolge" auf die Festplatte geschrieben, wobei der Schreibkopf nur eine kontinuierliche Wischbewegung ausführen musste, um die Dateien auf die Festplatte zu schreiben es ging ... anstatt überall herumzuspringen.

Natürlich ist der Gewinn bei heutigen schnellen Festplatten - ganz zu schweigen von Solid-State-Geräten - viel geringer ... insbesondere bei einem Heim-Linux-System, bei dem nur ein Benutzer gleichzeitig und mit nur wenigen Programmen arbeitet.

Wie auch immer, die Kombination aus dem Antizipieren von Lesevorgängen durch Einlesen (in den Cache / Puffer) von mehr als der verlangten Menge - und dem Sortieren von Daten, die darauf warten, geschrieben zu werden, damit sie in "einer Bewegung" geschrieben werden können - war tatsächlich eine sehr gute Idee bei der Dies gilt insbesondere für Systeme, auf denen viele Benutzer viel lesen und schreiben.

Baard Kopperud
quelle
2
XFS entscheidet nicht einmal, wo die Daten bis zum Auslesen abgelegt werden sollen. Durch die verzögerte Zuweisung erhält der Zuweiser viel mehr Informationen, auf die er seine Entscheidungen stützen kann. Wenn eine Datei zum ersten Mal geschrieben wird, ist nicht abzusehen, ob es sich um eine 4k-Datei oder eine 1G-Datei handelt, die noch wächst. Wenn es irgendwo 10 GB zusammenhängenden freien Speicherplatz gibt, hilft es nicht, die 4k-Datei an den Anfang zu setzen. Wenn Sie die große Datei an den Anfang eines großen freien Speicherplatzes stellen, wird die Fragmentierung verringert.
Peter Cordes
13

Es ist nicht Linux-spezifisch und wird als Seiten-Cache bezeichnet (was Linux recht gut kann). Siehe auch http://linuxatemyram.com/ ; Wenn also eine Datei geschrieben und einige Sekunden später erneut gelesen wird, ist sehr oft keine Festplatten-E / A erforderlich.

Der Hauptvorteil ist, dass auf vielen Systemen viel RAM vorhanden ist und ein Teil davon vom Kernel als Cache verwendet werden kann. Daher können einige Dateivorgänge von dieser Zwischenspeicherung profitieren. Außerdem ist die Festplatten-E / A-Zeit viel langsamer (normalerweise viele tausend Mal für SDD und fast eine Million Mal langsamer für mechanische Festplatten) als der Arbeitsspeicher.

Anwendungscode kann Hinweise zu diesem Caching geben: siehe zB posix_fadvise (2) & madvise (2)

Basile Starynkevitch
quelle
8

Die sich drehenden Platten sind langsamer als der Arbeitsspeicher. Wir verwenden die Zwischenspeicherung von Lese- / Schreibvorgängen, um diese Tatsache zu "verbergen".

Das Nützliche beim Schreiben von E / A ist, dass keine sofortige Datenträger-E / A erforderlich ist - im Gegensatz zu einem Lesevorgang, bei dem Sie keine Daten an den Benutzer zurückgeben können, bis der Lesevorgang auf dem Datenträger abgeschlossen ist.

Auf diese Weise werden Schreibvorgänge unter einer weichen Zeitbeschränkung ausgeführt. Solange unser anhaltender Durchsatz den unserer Festplatte nicht überschreitet, können wir viele der Leistungsnachteile in einem Schreibcache verbergen.

Und wir müssen Cache schreiben - rotierende Festplatten sind vergleichsweise langsam. Aber damit haben moderne RAID-Typen einen erheblichen Nachteil für den Betrieb.

Ein RAID 6 zum Beispiel muss, um eine Schreib-E / A abzuschließen,:

  • Update-Block lesen
  • Lesen Sie parity1
  • Parität 2 lesen
  • neuen Block schreiben
  • Schreibe Parität 1
  • Schreibe Parität 2

Somit umfasst jeder Schreibvorgang tatsächlich 6 E / A-Vorgänge - und besonders wenn Sie langsame Festplatten wie große SATA-Laufwerke haben, wird dies extrem teuer.

Aber es gibt eine schöne, einfache Lösung - das Zusammenführen von Texten. Wenn Sie einen "Full Stripe" -Schreibvorgang in einem Puffer erstellen können, müssen Sie die Parität nicht von Ihrer Festplatte lesen, sondern können sie basierend auf dem im Speicher vorhandenen Wert berechnen.

Dies ist sehr wünschenswert, da Sie dann keine Schreibverstärkung mehr haben. In der Tat können Sie mit einer geringeren Schreibstrafe als RAID 1 + 0 enden.

Erwägen:

RAID 6, 8 + 2 - 10 Spindeln.

8 aufeinanderfolgende Datenblöcke zum Schreiben - Parität im Cache berechnen und einen Block auf jede Platte schreiben. 10 Schreibvorgänge pro 8 bedeuten eine Schreibstrafe von 1,25. 10 Festplatten mit RAID 1 + 0 haben immer noch eine Schreibstrafe von 2 (da Sie in jeden Submirror schreiben müssen). In diesem Szenario kann RAID 6 also eine bessere Leistung als RAID1 + 0 erzielen. In der Praxis erhalten Sie jedoch eher ein gemischtes E / A-Profil.

Das Write-Caching wirkt sich also erheblich auf die wahrgenommene Leistung von RAID-Sets aus. Sie können mit RAM-Geschwindigkeit schreiben und haben einen geringen Schreibaufwand.

Und wenn Sie dies nicht tun, leiden Sie unter der schlechten Leistung von SATA, aber multiplizieren Sie es mit 6 und fügen Sie einen Konflikt hinzu. Ihr 10-Wege-SATA-RAID-6 ohne Schreib-Caching wäre etwas schneller als ein einzelnes Laufwerk ohne RAID ... aber nicht sehr viel.

Sie gehen ein Risiko ein, obwohl - wie Sie bemerken - Stromausfall Datenverlust bedeutet. Sie können dies durch Leeren des Caches, Sichern des Caches durch Akkus oder Verwendung von SSDs oder anderen nichtflüchtigen Caches abmildern.

Sobrique
quelle
7

Keine der anderen Antworten erwähnte eine verspätete Zuteilung . XFS, ext4, BTRFS und ZFS verwenden es alle. XFS hat es verwendet, bevor es ext4 gab. Ich werde es als Beispiel verwenden:

XFS entscheidet nicht einmal, wo die Daten bis zum Auslesen abgelegt werden sollen. Durch die verzögerte Zuweisung erhält der Zuweiser viel mehr Informationen, auf die er seine Entscheidungen stützen kann. Wenn eine Datei zum ersten Mal geschrieben wird, ist nicht abzusehen, ob es sich um eine 4k-Datei oder eine 1G-Datei handelt, die noch wächst. Wenn es irgendwo 10 GB zusammenhängenden freien Speicherplatz gibt, hilft es nicht, die 4k-Datei an den Anfang zu setzen. Wenn Sie die große Datei an den Anfang eines großen freien Speicherplatzes stellen, wird die Fragmentierung verringert.

Peter Cordes
quelle
4

Alle anderen Antworten hier sind im Normalfall mindestens korrekt, und ich würde empfehlen, sie vor meinen zu lesen, aber Sie erwähnten, dass dd und dd einen typischen Anwendungsfall haben, der möglicherweise kein Schreib-Caching beinhaltet. Der Schreibcache wird hauptsächlich auf Dateisystemebene implementiert. Raw-Geräte schreiben normalerweise kein Caching (mehrere Gerätetreiber wie raid oder lvm sind eine weitere Wachsfigur). Da dd häufig mit Raw-Block-Geräten verwendet wird, bietet es das bs und die zugehörigen Optionen, um umfangreiche Schreibvorgänge für eine bessere Leistung auf Raw-Geräten zu ermöglichen. Dies ist nicht so nützlich, wenn beide Endpunkte reguläre Dateien sind (obwohl große Schreibvorgänge in diesem Fall weniger Systemaufrufe erfordern). Die andere häufige Stelle, an der dies besonders deutlich wird, ist das mtools-Paket, eine Implementierung eines fetten Dateisystems im Userspace. Die Verwendung von mtools mit einem Diskettenlaufwerk fühlt sich immer unglaublich träge an, da die Tools vollständig synchron sind und Diskettenlaufwerke unglaublich langsam sind. Das Mounten der Diskette und die Verwendung des Kernel-Fat-Dateisystems ist viel reaktionsschneller, mit Ausnahme von synchronem Umount (und sehr wichtig, um Datenverlust zu vermeiden, insbesondere bei Wechselmedien wie Disketten). Es gibt nur wenige andere Programme, von denen ich weiß, dass sie regelmäßig mit Raw-Geräten wie speziell konfigurierten Datenbanken (die ihr eigenes Schreib-Caching implementieren), Tar sowie speziellen Geräte- und Dateisystem-Tools wie chdsk, mkfs und mt verwendet werden. Das Mounten der Diskette und die Verwendung des Kernel-Fat-Dateisystems ist viel reaktionsschneller, mit Ausnahme von synchronem Umount (und sehr wichtig, um Datenverlust zu vermeiden, insbesondere bei Wechselmedien wie Disketten). Es gibt nur wenige andere Programme, von denen ich weiß, dass sie regelmäßig mit Raw-Geräten wie speziell konfigurierten Datenbanken (die ihr eigenes Schreib-Caching implementieren), Tar sowie speziellen Geräte- und Dateisystem-Tools wie chdsk, mkfs und mt verwendet werden. Das Mounten der Diskette und die Verwendung des Kernel-Fat-Dateisystems ist viel reaktionsschneller, mit Ausnahme von synchronem Umount (und sehr wichtig, um Datenverlust zu vermeiden, insbesondere bei Wechselmedien wie Disketten). Es gibt nur wenige andere Programme, von denen ich weiß, dass sie regelmäßig mit Raw-Geräten wie speziell konfigurierten Datenbanken (die ihr eigenes Schreib-Caching implementieren), Tar sowie speziellen Geräte- und Dateisystem-Tools wie chdsk, mkfs und mt verwendet werden.

hildred
quelle
4
Linux-Blockgeräte lesen / schreiben standardmäßig den Seiten-Cache. Sie müssen verwenden, O_DIRECTwenn Sie den Cache umgehen möchten. dd oflag=direct. IIRC, einige Unices leiten standardmäßig E / A auf Blockgeräten. (Und Sie müssen ausgerichtete Blöcke lesen / schreiben, was Linux nicht tut, weil es sowieso nur den Pagecache schreibt.)
Peter Cordes
3

Die Philosophie ist standardmäßig unsicher.

Es gibt zwei sinnvolle und offensichtliche Strategien: Schreibvorgänge sofort auf die Festplatte leeren oder Schreibvorgänge verzögern. UNIX hat sich historisch für Letzteres entschieden. Holen Sie sich also Sicherheit, Sie müssen danach anrufen fsync.

Sie können die Sicherheit jedoch im Voraus festlegen, indem Sie ein Gerät mit der Option einbinden sync, oder indem Sie es pro Datei mit öffnen O_SYNC.

Denken Sie daran, dass UNIX für Computerfachleute entwickelt wurde. "Standardmäßig sicher" war keine Überlegung. Sicherheit bedeutet langsamere E / A, und diese frühen Systeme hatten wirklich langsame E / A, was die Preisrate hoch machte. Leider haben weder UNIX noch Linux auf safe-be-default umgestellt, auch wenn dies eine ununterbrochene Änderung ist.

MSalters
quelle
6
Eine sehr große Mehrheit der Anwendungen und Benutzer benötigt oder kümmert sich nicht um die Sicherheit, die synchrone Schreibvorgänge bieten würden. Bei einem Absturz oder Stromausfall besteht die Gefahr, dass Sie bis zu 30 Sekunden Daten verlieren. Für die meisten Menschen ist das in Ordnung, es sei denn, es handelt sich um eine finanzielle Transaktion oder Ähnliches, die mehr als 30 Sekunden unserer Zeit kostet. Die Standardeinstellung für synchrone E / As hätte impliziert, dass für alle Anwendungen, die auf Benutzerfreundlichkeit abzielen, O_NOSYNC definiert ist.
Juli
2

Es handelt sich um ein kleines Maß an Zuverlässigkeit für eine große Steigerung des Durchsatzes.

Nehmen wir zum Beispiel ein Videokomprimierungsprogramm an. Mit verzögertem Schreiben ("Write Back"):

  1. Verbringen Sie 10 ms damit, den Frame zu komprimieren
  2. Geben Sie einen Schreibrahmen auf die Festplatte aus
  3. Warten Sie 10 ms, bis der Datenträger bestätigt, dass der Schreibvorgang abgeschlossen ist
  4. GOTO 1

Gegen

  1. Verbringen Sie 10 ms damit, den Frame zu komprimieren
  2. Schreibrahmen auf Festplatte ausgeben (wird im Hintergrund abgeschlossen)
  3. GOTO 1

Die zweite Version erscheint doppelt so schnell, weil sie gleichzeitig die CPU und die Festplatte nutzen kann, während die erste Version immer auf die eine oder andere wartet.

Im Allgemeinen möchten Sie ein Zurückschreiben für Streaming- und Massendateivorgänge sowie ein Durchschreiben für Datenbanken und datenbankähnliche Anwendungen.

pjc50
quelle
1

In vielen Anwendungen sind Speichergeräte zeitweise mit dem Lesen von Daten beschäftigt. Wenn ein System immer in der Lage ist, Schreibvorgänge zu verschieben, bis das Speichergerät nicht mehr mit dem Lesen von Daten beschäftigt ist, dauert es aus Sicht einer Anwendung null Mal, bis die Schreibvorgänge abgeschlossen sind. Die einzigen Situationen, in denen das Schreiben nicht sofort erfolgen kann, sind folgende:

  1. Schreibpuffer füllen sich bis zu dem Punkt, an dem keine Anforderungen für verzögertes Schreiben mehr akzeptiert werden können, bis die Schreibvorgänge tatsächlich abgeschlossen sind.

  2. Das Gerät, für das Schreibvorgänge ausstehen, muss heruntergefahren oder entfernt werden.

  3. Eine Anwendung fordert ausdrücklich eine Bestätigung an, dass ein Schreibvorgang tatsächlich abgeschlossen ist.

Tatsächlich muss das Schreiben nur aufgrund der oben genannten Anforderungen überhaupt stattfinden. Andererseits gibt es im Allgemeinen keinen Grund, keine ausstehenden Schreibvorgänge in Zeiten durchzuführen, in denen ein Gerät sonst im Leerlauf wäre, sodass viele Systeme diese dann ausführen.

Superkatze
quelle
0

Es gibt auch dies:

Schreiben Sie "Hi, Joe Moe"
ist schneller als:
Schreiben Sie "Hi,"
Schreiben Sie "Joe"
Schreiben Sie "Moe"

Und auch:

Schreiben Sie "Hallo, wie geht es dir?"
ist schneller als:
Schreiben Sie "Hallo, was ist los?"
Löschen Sie das
Schreiben "Howdy, wie geht es dir?"
Löschen Sie das
Schreiben "Hallo, wie geht es dir?"

Es ist besser, Änderungen und Aggregationen im RAM vorzunehmen als auf der Festplatte. Batching Disk Writes befreit Anwendungsentwickler von solchen Bedenken.

Rolf
quelle