Unter Linux bedeutet die vollständige Ausführung eines Befehls wie cp
oder dd
nicht, dass die Daten auf das Gerät geschrieben wurden. Man muss zum Beispiel sync
die 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?
kernel
drivers
io
unix-philosophy
marmistrz
quelle
quelle
Antworten:
Effizienz (bessere Nutzung der Datenträgereigenschaften) und Leistung (ermöglicht es der Anwendung, unmittelbar nach einem Schreibvorgang fortzufahren).
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
write
Systemaufruf 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.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.
quelle
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.
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.
quelle
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 :
In Ihrer Frage haben Sie auch geschrieben:
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
fsync
Systemaufruf 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 Optionconv=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 normalerweisefsck
beim Neustart ausgeführt, wenn sie feststellen, dass Dateisysteme nicht ordnungsgemäß heruntergefahren wurden.quelle
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.
quelle
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)
quelle
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,:
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.
quelle
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.
quelle
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.
quelle
O_DIRECT
wenn 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.)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 öffnenO_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.
quelle
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"):
Gegen
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.
quelle
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:
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.
Das Gerät, für das Schreibvorgänge ausstehen, muss heruntergefahren oder entfernt werden.
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.
quelle
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.
quelle