Wie funktioniert der Schreibcache mit einem Dateisystem, das Festplatten mit unterschiedlichen Geschwindigkeiten umfasst?

9

Wie werden auf einem modernen Linux-System mit mehreren Festplatten und einem Software-RAID, das sowohl langsame (HDD) als auch schnelle (SSD) Laufwerke umfasst, Schreibvorgänge in das zwischengespeicherte Dateisystem durchgeführt?

Für md-raid RAID1 kann das Array mit Festplatten konfiguriert werden , wie --write-mostlyund --write-behindwas darauf schließen läßt , dass liest aus der schnelleren Festplatte durchgeführt wird , und dass die Schreibvorgänge auf die langsamere Festplatte können hinterherhinken. Aber wie wird das auf Kernel-Ebene zwischengespeichert? Zwischenspeichert der Kernel die Festplatte, die die Festplatte vor oder nach der md-raid-Schicht schreibt? Werden die Daten am Ende eines write () -Aufrufs garantiert auf eine der Not- --write-behindDisks geschrieben?

btrfsWie würde sich für ein RAID1 die gleiche Situation entwickeln? Es gibt keine --write-behindFunktionalität. Werden schmutzige Seiten also auf Geräte- oder Dateisystemebene gezählt? Wann würde ein write () zurückkehren?

Wie wirken sich die vm.dirty_*ratioTunables auf diese Setups aus?

Steven Davies
quelle

Antworten:

7

Die --write-mostly, --write-behinddurch die behandelt mdintern Treiber. mdBehält Metadaten bei, wie die Bitmap mit Schreibabsicht (die für die Funktion zum Zurückschreiben obligatorisch ist), die im Grunde protokolliert, welche Daten noch geschrieben wurden und welche Daten noch fehlen. Dies ist erforderlich, wenn ein Stromausfall auftritt und die Daten die meist schreibbaren Geräte noch nicht erreicht haben. In diesem Fall wird der betroffene Datenbereich erneut synchronisiert (in Ihrem Fall von der SSD gelesen, auf die Festplatte geschrieben).

Aber wie wird das auf Kernel-Ebene zwischengespeichert?

Für den Write-Behind-Fall dupliziert der MD-Treiber die Schreibanforderung grundsätzlich intern. Die Master-Schreibanforderung geht an die primären Laufwerke und teilt den oberen Ebenen mit, dass "OK, das habe ich bereits getan". Die kopierte Schreibanforderung bleibt dann für die meist hinter dem Schreiben befindliche Seite des RAID bestehen und kann länger dauern, hoffentlich ohne dass es jemand merkt.

Dann unternimmt die RAID-Schicht viele Schritte, um sicherzustellen, dass keine Daten vom Schreibgerät gelesen werden, solange noch Schreibanfragen in der Warteschlange anstehen. Warum sollten Daten von einem Schreibgerät gelesen werden? Nun, die SSD ist möglicherweise ausgefallen, es ist also alles übrig, was noch übrig ist. Es ist kompliziert und das Zurückschreiben führt einige Eckfälle ein.

Das ist wahrscheinlich auch der Grund, warum es nur für RAID-1-Level unterstützt wird, nicht für die anderen. Obwohl es theoretisch sinnvoll sein könnte, SSDs im Wesentlichen als RAID-0 und zwei Paritäts-HDDs im Write-Behind-Modus zu haben, gibt es keine Unterstützung für ein solches Write-Behind-RAID-6. Es ist nur RAID-1 und wird selbst dort selten verwendet.

Die anderen Cache-Einstellungen bleiben davon unberührt. Grundsätzlich kümmert sich der gesamte Caching-Mechanismus nicht im geringsten darum, wie der mdTreiber die Dinge intern implementiert hat. Der Cache macht sein Ding und md macht sein Ding. Ein Dateisystem-Cache funktioniert also für ein Dateisystem auf md genauso wie für ein Dateisystem auf einem leeren Laufwerk. (Die Realität ist etwas komplizierter, aber Sie können sich das so vorstellen.)

Frostschutz
quelle
3

Für md-raid RAID1 kann das Array mit Festplatten konfiguriert werden , wie --write-mostlyund --write-behindwas darauf schließen läßt , dass liest aus der schnelleren Festplatte durchgeführt wird , und dass die Schreibvorgänge auf die langsamere Festplatte können hinterherhinken. Aber wie wird das auf Kernel-Ebene zwischengespeichert? Zwischenspeichert der Kernel die Festplatte, die die Festplatte vor oder nach der md-raid-Schicht schreibt?

Danach, da diese Funktion spezifisch für md-raid ist.

Sie sollten sich diese md-raid-Funktion als Pufferung und nicht als Caching vorstellen. Es ist durch die folgende mdadmOption begrenzt:

--write-Behind =

Geben Sie an, dass der Write-Behind-Modus aktiviert sein soll (nur für RAID1 gültig). Wenn ein Argument angegeben wird, wird die maximal zulässige Anzahl ausstehender Schreibvorgänge festgelegt. Der Standardwert ist 256.

Ich kann nur denken, dass es auch durch die normale Kernel- und Hardware-Pufferung begrenzt ist (dh wenn das kleiner ist). Die normale Kernelpufferung ist durch nr_requestsund begrenzt max_hw_sectors_kb. Siehe /sys/class/block/$write_behind_device/queue/. Mit Hardware-Pufferung meine ich den Schreibcache auf dem Laufwerk.

Werden die Daten am Ende eines write () -Aufrufs garantiert auf eine der Not- --write-behindDisks geschrieben?

Angenommen, Sie meinen, das write () befand sich in einer mit O_SYNC / O_DSYNC geöffneten Datei, oder Sie meinten tatsächlich write () + fsync (). Wenn nicht, gelten keinerlei Garantien.

sourcejedi
quelle
Vielen Dank, aber das wirft eine andere Frage auf: Wenn die Datei mit O_SYNC geöffnet wurde, kehrt write () zurück, nachdem die erste Festplatte beschrieben wurde oder in diesem Fall alle Festplatten beschrieben wurden?
Steven Davies
3
Die Unterschreibvorgänge auf nicht
schreibbare