ZFS-Grundlagen: Speicher und Leistung

ZFS-Grundlagen: Speicher und Leistung

In diesem FrĂŒhjahr haben wir bereits einige EinfĂŒhrungsthemen besprochen, zum Beispiel: So ĂŒberprĂŒfen Sie die Geschwindigkeit Ihrer Laufwerke Đž Was ist RAID?. Im zweiten Teil haben wir sogar versprochen, die Leistung verschiedener Multi-Disk-Topologien in ZFS weiter zu untersuchen. Dies ist das Dateisystem der nĂ€chsten Generation, das jetzt ĂŒberall implementiert wird: von Apple auf Ubuntu.

Nun, heute ist der beste Tag, um ZFS kennenzulernen, neugierige Leser. Man muss nur wissen, dass es nach der bescheidenen Meinung des OpenZFS-Entwicklers Matt Ahrens „wirklich schwer“ ist.

Aber bevor wir zu den Zahlen fĂŒr alle Optionen fĂŒr eine ZFS-Konfiguration mit acht Festplatten kommen – und das verspreche ich –, mĂŒssen wir darĂŒber reden als Im Allgemeinen speichert ZFS Daten auf der Festplatte.

Zpool, vdev und GerÀt

ZFS-Grundlagen: Speicher und Leistung
Dieses vollstĂ€ndige Pooldiagramm enthĂ€lt drei Hilfs-vdevs, eines fĂŒr jede Klasse und vier fĂŒr RAIDz2

ZFS-Grundlagen: Speicher und Leistung
Normalerweise gibt es keinen Grund, einen Pool nicht ĂŒbereinstimmender VDEV-Typen und -GrĂ¶ĂŸen zu erstellen – aber nichts hindert Sie daran, dies zu tun, wenn Sie möchten.

Um das ZFS-Dateisystem wirklich zu verstehen, mĂŒssen Sie sich seine tatsĂ€chliche Struktur genau ansehen. Erstens vereinheitlicht ZFS die herkömmlichen Ebenen der Volume- und Dateisystemverwaltung. Zweitens verwendet es einen transaktionalen Copy-on-Write-Mechanismus. Durch diese Merkmale unterscheidet sich das System strukturell stark von herkömmlichen Dateisystemen und RAID-Arrays. Der erste Satz grundlegender Bausteine, die es zu verstehen gilt, sind der Speicherpool (zpool), das virtuelle GerĂ€t (vdev) und das reale GerĂ€t (device).

zpool

Der Zpool-Speicherpool ist die oberste ZFS-Struktur. Jeder Pool enthÀlt ein oder mehrere virtuelle GerÀte. Jeder von ihnen enthÀlt wiederum ein oder mehrere reale GerÀte (GerÀt). Virtuelle Pools sind in sich geschlossene Blöcke. Ein physischer Computer kann zwei oder mehr separate Pools enthalten, aber jeder ist völlig unabhÀngig voneinander. Pools können keine virtuellen GerÀte gemeinsam nutzen.

Die Redundanz von ZFS liegt auf der Ebene der virtuellen GerĂ€te, nicht auf der Poolebene. Auf Poolebene gibt es absolut keine Redundanz – wenn ein Laufwerks-VDEV oder ein spezielles VDEV verloren geht, geht auch der gesamte Pool verloren.

Moderne Speicherpools können den Verlust eines Caches oder eines Protokolls eines virtuellen GerĂ€ts ĂŒberstehen – allerdings können sie eine kleine Menge fehlerhafter Daten verlieren, wenn sie das vdev-Protokoll wĂ€hrend eines Stromausfalls oder eines Systemabsturzes verlieren.

Es gibt ein weit verbreitetes MissverstĂ€ndnis, dass ZFS-„Datenstreifen“ ĂŒber den gesamten Pool geschrieben werden. Das ist nicht wahr. Zpool ist ĂŒberhaupt kein lustiges RAID0, es ist eher lustig JBOD mit einem komplexen variablen Verteilungsmechanismus.

Meistens werden die DatensĂ€tze entsprechend dem verfĂŒgbaren freien Speicherplatz auf die verfĂŒgbaren virtuellen GerĂ€te verteilt, sodass sie theoretisch alle gleichzeitig gefĂŒllt werden. In spĂ€teren Versionen von ZFS wird die aktuelle vdev-Nutzung (Auslastung) berĂŒcksichtigt – wenn ein virtuelles GerĂ€t deutlich ausgelastet ist als ein anderes (z. B. aufgrund der Leselast), wird es trotz der höchsten freien KapazitĂ€t vorĂŒbergehend zum Schreiben ĂŒbersprungen RaumverhĂ€ltnis.

Der in moderne ZFS-Schreibzuweisungsmethoden integrierte Auslastungserkennungsmechanismus kann in Zeiten ungewöhnlich hoher Auslastung die Latenz reduzieren und den Durchsatz erhöhen – dies ist jedoch nicht der Fall Blankovollmacht zum unfreiwilligen Mischen von langsamen Festplatten und schnellen SSDs in einem Pool. Ein solcher ungleicher Pool arbeitet immer noch mit der Geschwindigkeit des langsamsten GerĂ€ts, das heißt, als bestĂŒnde er vollstĂ€ndig aus solchen GerĂ€ten.

vdev

Jeder Speicherpool besteht aus einem oder mehreren virtuellen GerĂ€ten (virtuelles GerĂ€t, vdev). Jedes vdev enthĂ€lt wiederum ein oder mehrere reale GerĂ€te. Die meisten virtuellen GerĂ€te werden fĂŒr die einfache Datenspeicherung verwendet, es gibt jedoch mehrere vdev-Hilfsklassen, darunter CACHE, LOG und SPECIAL. Jeder dieser vdev-Typen kann eine von fĂŒnf Topologien haben: EinzelgerĂ€t (EinzelgerĂ€t), RAIDz1, RAIDz2, RAIDz3 oder Spiegel (Spiegel).

RAIDz1, RAIDz2 und RAIDz3 sind spezielle Varianten dessen, was die Oldtimer als doppeltes (diagonales) ParitĂ€ts-RAID bezeichnen wĂŒrden. 1, 2 und 3 beziehen sich darauf, wie viele ParitĂ€tsblöcke jedem Datenstreifen zugewiesen werden. Anstelle separater Festplatten fĂŒr die ParitĂ€t verteilen virtuelle RAIDz-GerĂ€te diese ParitĂ€t halbgleichmĂ€ĂŸig auf die Festplatten. Ein RAIDz-Array kann so viele Festplatten verlieren, wie es ĂŒber ParitĂ€tsblöcke verfĂŒgt. Wenn ein weiterer verloren geht, stĂŒrzt er ab und nimmt den Speicherpool mit.

Bei gespiegelten virtuellen GerĂ€ten (Spiegel-VDEV) wird jeder Block auf jedem GerĂ€t im VDEV gespeichert. Obwohl Spiegel mit zwei Breiten am hĂ€ufigsten vorkommen, kann sich eine beliebige Anzahl von GerĂ€ten in einem Spiegel befinden. In großen Installationen werden hĂ€ufig Dreifachspiegel verwendet, um die Leseleistung und Fehlertoleranz zu verbessern. Ein Vdev-Spiegel kann jeden Ausfall ĂŒberstehen, solange mindestens ein GerĂ€t im Vdev weiterhin funktioniert.

Einzelne Vdevs sind von Natur aus gefĂ€hrlich. Ein solches virtuelles GerĂ€t ĂŒberlebt keinen einzigen Ausfall – und wenn es als Speicher oder als spezielles VDEV verwendet wird, fĂŒhrt sein Ausfall zur Zerstörung des gesamten Pools. Seien Sie hier sehr, sehr vorsichtig.

CACHE-, LOG- und SPECIAL-VAs können mit jeder der oben genannten Topologien erstellt werden. Bedenken Sie jedoch, dass der Verlust einer SPECIAL-VA den Verlust des Pools bedeutet. Daher wird eine redundante Topologie dringend empfohlen.

GerÀt

Dies ist wahrscheinlich der am einfachsten zu verstehende Begriff in ZFS – es handelt sich im wahrsten Sinne des Wortes um ein Block-Random-Access-GerĂ€t. Denken Sie daran, dass virtuelle GerĂ€te aus einzelnen GerĂ€ten bestehen, wĂ€hrend ein Pool aus virtuellen GerĂ€ten besteht.

Festplatten – entweder magnetische oder Festkörperplatten – sind die am hĂ€ufigsten verwendeten BlockgerĂ€te, die als Bausteine ​​von vdev verwendet werden. Allerdings reicht jedes GerĂ€t mit einem Deskriptor in /dev aus, sodass ganze Hardware-RAID-Arrays als separate GerĂ€te verwendet werden können.

Eine einfache Rohdatei ist eines der wichtigsten alternativen BlockgerĂ€te, aus denen ein VDEV erstellt werden kann. Testpools von spĂ€rliche Dateien ist eine sehr praktische Möglichkeit, Poolbefehle zu ĂŒberprĂŒfen und zu sehen, wie viel Speicherplatz in einem Pool oder virtuellen GerĂ€t einer bestimmten Topologie verfĂŒgbar ist.

ZFS-Grundlagen: Speicher und Leistung
Sie können in wenigen Sekunden einen Testpool aus Sparse-Dateien erstellen – vergessen Sie jedoch nicht, anschließend den gesamten Pool und seine Komponenten zu löschen

Nehmen wir an, Sie möchten einen Server auf acht Festplatten aufstellen und planen, 10-TB-Festplatten (~9300 GiB) zu verwenden – sind sich aber nicht sicher, welche Topologie Ihren Anforderungen am besten entspricht. Im obigen Beispiel erstellen wir in Sekundenschnelle einen Testpool aus Dateien mit geringer Dichte – und jetzt wissen wir, dass ein RAIDz2-vdev mit acht 10-TB-Festplatten 50 TiB nutzbare KapazitĂ€t bietet.

Eine weitere spezielle GerĂ€teklasse ist SPARE (Ersatz). Hot-Swap-GerĂ€te gehören im Gegensatz zu normalen GerĂ€ten zum gesamten Pool und nicht zu einem einzelnen virtuellen GerĂ€t. Wenn ein Vdev im Pool ausfĂ€llt und ein ErsatzgerĂ€t mit dem Pool verbunden und verfĂŒgbar ist, wird es automatisch dem betroffenen Vdev beitreten.

Nach der Verbindung mit dem betroffenen vdev beginnt das ErsatzgerÀt, Kopien oder Rekonstruktionen der Daten zu empfangen, die sich auf dem fehlenden GerÀt befinden sollten. Bei herkömmlichem RAID wird dies als Neuaufbau bezeichnet, wÀhrend es bei ZFS als Resilvering bezeichnet wird.

Es ist wichtig zu beachten, dass ErsatzgerĂ€te ausgefallene GerĂ€te nicht dauerhaft ersetzen. Dies ist nur ein vorĂŒbergehender Ersatz, um die Zeitspanne zu verkĂŒrzen, in der vdev beeintrĂ€chtigt wird. Nachdem der Administrator das ausgefallene Vdev ersetzt hat, wird die Redundanz auf diesem permanenten GerĂ€t wiederhergestellt, und SPARE wird vom Vdev getrennt und arbeitet wieder als ErsatzgerĂ€t fĂŒr den gesamten Pool.

DatensÀtze, Blöcke und Sektoren

Bei den nĂ€chsten Bausteinen, die wir auf unserer ZFS-Reise verstehen sollten, geht es weniger um die Hardware als vielmehr darum, wie die Daten selbst organisiert und gespeichert werden. Wir ĂŒberspringen hier ein paar Ebenen – wie zum Beispiel Metaslab – um die Details nicht zu ĂŒberladen und gleichzeitig ein VerstĂ€ndnis fĂŒr die Gesamtstruktur zu bewahren.

Datensatz (Datensatz)

ZFS-Grundlagen: Speicher und Leistung
Wenn wir zum ersten Mal einen Datensatz erstellen, wird der gesamte verfĂŒgbare Poolraum angezeigt. Dann legen wir die Quote fest – und Ă€ndern den Mount-Punkt. Magie!

ZFS-Grundlagen: Speicher und Leistung
Zvol ist grĂ¶ĂŸtenteils nur ein Datensatz ohne Dateisystemschicht, den wir hier durch ein völlig normales ext4-Dateisystem ersetzen.

Ein ZFS-Datensatz entspricht in etwa einem standardmĂ€ĂŸig gemounteten Dateisystem. Wie ein normales Dateisystem sieht es auf den ersten Blick wie „nur ein weiterer Ordner“ aus. Aber genau wie normale einhĂ€ngbare Dateisysteme verfĂŒgt jeder ZFS-Datensatz ĂŒber seinen eigenen Satz grundlegender Eigenschaften.

ZunÀchst kann einem Datensatz eine Quote zugewiesen werden. Wenn festgelegt zfs set quota=100G poolname/datasetname, dann können Sie nicht in den bereitgestellten Ordner schreiben /poolname/datasetname mehr als 100 GiB.

Ist Ihnen das Vorhandensein – und Fehlen – von SchrĂ€gstrichen am Anfang jeder Zeile aufgefallen? Jeder Datensatz hat seinen eigenen Platz sowohl in der ZFS-Hierarchie als auch in der System-Mount-Hierarchie. In der ZFS-Hierarchie gibt es keinen fĂŒhrenden SchrĂ€gstrich – Sie beginnen mit dem Poolnamen und dann dem Pfad von einem Datensatz zum nĂ€chsten. Zum Beispiel, pool/parent/child fĂŒr einen Datensatz mit dem Namen child unter dem ĂŒbergeordneten Datensatz parent in einem Pool mit einem kreativen Namen pool.

StandardmĂ€ĂŸig entspricht der Mountpunkt des Datensatzes seinem Namen in der ZFS-Hierarchie, mit einem fĂŒhrenden SchrĂ€gstrich – dem benannten Pool pool montiert als /pool, Datensatz parent montiert /pool/parentund der untergeordnete Datensatz child montiert /pool/parent/child. Der System-Mount-Punkt des Datensatzes kann jedoch geĂ€ndert werden.

Wenn wir angeben zfs set mountpoint=/lol pool/parent/child, dann der Datensatz pool/parent/child auf dem System montiert als /lol.

ZusĂ€tzlich zu DatensĂ€tzen sollten wir Volumes (zvols) erwĂ€hnen. Ein Volume ist ungefĂ€hr dasselbe wie ein Datensatz, außer dass es eigentlich kein Dateisystem hat – es ist nur ein BlockgerĂ€t. Sie können zum Beispiel erstellen zvol Mit Namen mypool/myzvol, formatieren Sie es dann mit einem ext4-Dateisystem und mounten Sie dann dieses Dateisystem – Sie haben jetzt ein ext4-Dateisystem, aber mit allen Sicherheitsfunktionen von ZFS! Das mag auf einer einzelnen Maschine albern erscheinen, ist aber als Backend beim Exportieren eines iSCSI-GerĂ€ts viel sinnvoller.

Blöcke

ZFS-Grundlagen: Speicher und Leistung
Die Datei wird durch einen oder mehrere Blöcke dargestellt. Jeder Block wird auf einem virtuellen GerĂ€t gespeichert. Die BlockgrĂ¶ĂŸe entspricht normalerweise dem Parameter DatensatzgrĂ¶ĂŸe, kann aber reduziert werden auf 2^Schichtwenn es Metadaten oder eine kleine Datei enthĂ€lt.

ZFS-Grundlagen: Speicher und Leistung
Wir wirklich wirklich Ich mache keine Witze ĂŒber die enormen Leistungseinbußen, wenn Sie eine zu kleine Verschiebung einstellen

In einem ZFS-Pool werden alle Daten, einschließlich Metadaten, in Blöcken gespeichert. Die maximale BlockgrĂ¶ĂŸe fĂŒr jeden Datensatz wird in der Eigenschaft definiert recordsize (DatensatzgrĂ¶ĂŸe). Die DatensatzgrĂ¶ĂŸe kann geĂ€ndert werden, aber die GrĂ¶ĂŸe oder Position von Blöcken, die bereits in den Datensatz geschrieben wurden, Ă€ndert sich dadurch nicht – es wirkt sich nur auf neue Blöcke aus, wenn sie geschrieben werden.

Sofern nicht anders angegeben, betrĂ€gt die aktuelle StandarddatensatzgrĂ¶ĂŸe 128 KiB. Es ist ein schwieriger Kompromiss, wenn die Leistung nicht perfekt ist, aber in den meisten FĂ€llen ist es auch nicht so schlimm. Recordsize kann auf einen beliebigen Wert von 4K bis 1M eingestellt werden (mit erweiterten Einstellungen). recordsize Sie können noch mehr installieren, aber das ist selten eine gute Idee.

Jeder Block bezieht sich auf die Daten nur einer Datei – Sie können nicht zwei verschiedene Dateien in einen Block packen. Jede Datei besteht je nach GrĂ¶ĂŸe aus einem oder mehreren Blöcken. Wenn die DateigrĂ¶ĂŸe kleiner als die DatensatzgrĂ¶ĂŸe ist, wird sie in einer kleineren BlockgrĂ¶ĂŸe gespeichert. Beispielsweise belegt ein Block mit einer 2-KiB-Datei nur einen 4-KiB-Sektor auf der Festplatte.

Wenn die Datei groß genug ist und mehrere Blöcke benötigt, werden alle DatensĂ€tze in dieser Datei die gleiche GrĂ¶ĂŸe haben recordsize - einschließlich des letzten Eintrags, dessen Hauptteil sein kann ungenutzter Raum.

Zvols haben keine Eigenschaft recordsize â€“ stattdessen haben sie eine gleichwertige Eigenschaft volblocksize.

Sektoren

Der letzte, grundlegendste Baustein ist der Sektor. Es ist die kleinste physische Einheit, die auf das zugrunde liegende GerĂ€t geschrieben oder von diesem gelesen werden kann. Mehrere Jahrzehnte lang verwendeten die meisten Festplatten 512-Byte-Sektoren. Neuerdings sind die meisten Festplatten auf 4-KiB-Sektoren eingestellt, und einige – insbesondere SSDs – haben 8-KiB-Sektoren oder sogar mehr.

Das ZFS-System verfĂŒgt ĂŒber eine Eigenschaft, mit der Sie die SektorgrĂ¶ĂŸe manuell festlegen können. Diese Liegenschaft ashift. Etwas verwirrend ist, dass ashift eine Zweierpotenz ist. Zum Beispiel, ashift=9 bedeutet eine SektorgrĂ¶ĂŸe von 2^9 oder 512 Bytes.

ZFS fragt beim HinzufĂŒgen eines BlockgerĂ€ts zu einem neuen virtuellen GerĂ€t (VDEV) detaillierte Informationen vom Betriebssystem ab und passt den ashift-Wert theoretisch automatisch entsprechend an. Leider geben viele Laufwerke falsche Angaben zur SektorgrĂ¶ĂŸe an, um die KompatibilitĂ€t mit anderen Systemen zu gewĂ€hrleisten. Windows XP (das nicht in der Lage war, Laufwerke mit unterschiedlichen SektorgrĂ¶ĂŸen zu verstehen).

Dies bedeutet, dass einem ZFS-Administrator dringend empfohlen wird, die tatsĂ€chliche SektorgrĂ¶ĂŸe seiner GerĂ€te zu kennen und manuell festzulegen ashift. Wenn ashift zu niedrig eingestellt ist, steigt die Anzahl der Lese-/SchreibvorgĂ€nge astronomisch an. Das Schreiben von 512-Byte-„Sektoren“ in einen echten 4-KiB-Sektor bedeutet also, dass man den ersten „Sektor“ schreiben, dann den 4-KiB-Sektor lesen, ihn mit einem zweiten 512-Byte-„Sektor“ modifizieren und ihn in den neuen zurĂŒckschreiben muss 4-KiB-Sektor usw. fĂŒr jeden Eintrag.

In der realen Welt trifft eine solche Strafe Samsung EVO SSDs, fĂŒr die ashift=13, aber diese SSDs lĂŒgen hinsichtlich ihrer SektorgrĂ¶ĂŸe und daher ist die Standardeinstellung auf eingestellt ashift=9. Wenn ein erfahrener Systemadministrator diese Einstellung nicht Ă€ndert, funktioniert diese SSD langsamer herkömmliche magnetische Festplatte.

Zum Vergleich, fĂŒr zu große GrĂ¶ĂŸe ashift es gibt praktisch keine Strafe. Es gibt keine wirklichen Leistungseinbußen und die Zunahme des ungenutzten Speicherplatzes ist verschwindend gering (bzw. Null bei aktivierter Komprimierung). Daher empfehlen wir dringend, auch Laufwerke zu installieren, die 512-Byte-Sektoren verwenden ashift=12 oder ashift=13mit Zuversicht in die Zukunft blicken.

Immobilien ashift wird fĂŒr jedes virtuelle vdev-GerĂ€t festgelegt und nicht fĂŒr den Pool, wie viele fĂ€lschlicherweise denken – und Ă€ndert sich nach der Installation nicht. Wenn Sie versehentlich getroffen haben ashift Wenn Sie einem Pool ein neues vdev hinzufĂŒgen, haben Sie diesen Pool unwiederbringlich mit einem GerĂ€t mit geringer Leistung verunreinigt, und es bleibt normalerweise keine andere Wahl, als den Pool zu zerstören und von vorne zu beginnen. Selbst das Entfernen von vdev wird Sie nicht vor einer fehlerhaften Konfiguration bewahren ashift!

Copy-on-Write-Mechanismus

ZFS-Grundlagen: Speicher und Leistung
Wenn ein normales Dateisystem Daten ĂŒberschreiben muss, Ă€ndert es jeden Block dort, wo er sich befindet

ZFS-Grundlagen: Speicher und Leistung
Ein Copy-on-Write-Dateisystem schreibt eine neue Blockversion und entsperrt dann die alte Version

ZFS-Grundlagen: Speicher und Leistung
Wenn wir abstrakt die tatsĂ€chliche physische Position der Blöcke ignorieren, wird unser „Datenkomet“ zu einem „Datenwurm“ vereinfacht, der sich von links nach rechts ĂŒber die Karte des verfĂŒgbaren Raums bewegt

ZFS-Grundlagen: Speicher und Leistung
Jetzt können wir uns ein gutes Bild davon machen, wie Copy-on-Write-Snapshots funktionieren – jeder Block kann zu mehreren Snapshots gehören und bleibt bestehen, bis alle zugehörigen Snapshots zerstört sind

Der Copy-on-Write-Mechanismus (CoW) ist die grundlegende Grundlage dafĂŒr, was ZFS zu einem so erstaunlichen System macht. Das Grundkonzept ist einfach: Wenn Sie ein herkömmliches Dateisystem auffordern, eine Datei zu Ă€ndern, wird es genau das tun, was Sie angefordert haben. Wenn Sie ein Copy-on-Write-Dateisystem bitten, dasselbe zu tun, wird es „ok“ sagen, Sie aber belĂŒgen.

Stattdessen schreibt ein Copy-on-Write-Dateisystem eine neue Version des geĂ€nderten Blocks und aktualisiert dann die Metadaten der Datei, um die VerknĂŒpfung des alten Blocks aufzuheben und den neuen Block, den Sie gerade geschrieben haben, damit zu verknĂŒpfen.

Das Lösen des alten Blocks und das VerknĂŒpfen des neuen Blocks erfolgt in einem Vorgang und kann daher nicht unterbrochen werden. Wenn Sie danach den Block ausschalten, haben Sie eine neue Version der Datei, und wenn Sie ihn frĂŒher ausschalten, haben Sie die alte Version . In jedem Fall kommt es zu keinen Konflikten im Dateisystem.

Copy-on-Write erfolgt in ZFS nicht nur auf Dateisystemebene, sondern auch auf der DatentrĂ€gerverwaltungsebene. Dies bedeutet, dass ZFS nicht durch Leerzeichen beeintrĂ€chtigt wird (ein Loch im RAID) – ein PhĂ€nomen, bei dem der Strip nur teilweise aufzeichnen konnte, bevor das System abstĂŒrzte und das Array nach einem Neustart beschĂ€digt wurde. Hier wird der Stripe atomar geschrieben, vdev ist immer sequentiell und Bob ist dein Onkel.

ZIL: ZFS-Absichtsprotokoll

ZFS-Grundlagen: Speicher und Leistung
Das ZFS-System behandelt synchrone SchreibvorgĂ€nge auf besondere Weise: Es speichert sie vorĂŒbergehend, aber sofort in ZIL, bevor es sie spĂ€ter zusammen mit asynchronen SchreibvorgĂ€ngen dauerhaft schreibt.

ZFS-Grundlagen: Speicher und Leistung
Normalerweise werden in eine ZIL geschriebene Daten nie wieder gelesen. Aber es ist nach einem Systemabsturz möglich

ZFS-Grundlagen: Speicher und Leistung
SLOG oder sekundĂ€res LOG-GerĂ€t ist nur ein spezielles – und vorzugsweise sehr schnelles – vdev, bei dem die ZIL getrennt vom Hauptspeicher gespeichert werden kann

ZFS-Grundlagen: Speicher und Leistung
Nach einem Absturz werden alle fehlerhaften Daten in ZIL wiedergegeben. In diesem Fall befindet sich ZIL auf SLOG und wird daher von dort aus wiedergegeben

Es gibt zwei Hauptkategorien von SchreibvorgĂ€ngen: synchrone (sync) und asynchrone (async). Bei den meisten Workloads erfolgt die ĂŒberwiegende Mehrheit der SchreibvorgĂ€nge asynchron – das Dateisystem ermöglicht die Aggregation und Ausgabe in Stapeln, wodurch die Fragmentierung verringert und der Durchsatz erheblich erhöht wird.

Eine ganz andere Sache sind synchronisierte Aufnahmen. Wenn eine Anwendung einen synchronen Schreibvorgang anfordert, teilt sie dem Dateisystem mit: „Sie mĂŒssen dies in den nichtflĂŒchtigen Speicher ĂŒbertragen.“ jetzt sofortBis dahin kann ich nichts anderes tun. Daher sollten synchrone SchreibvorgĂ€nge sofort auf die Festplatte ĂŒbertragen werden – und wenn dies die Fragmentierung erhöht oder den Durchsatz verringert, dann ist das so.

ZFS handhabt synchrone SchreibvorgĂ€nge anders als normale Dateisysteme – anstatt sie sofort in den regulĂ€ren Speicher zu ĂŒbertragen, schreibt ZFS sie in einen speziellen Speicherbereich namens ZFS Intent Log (ZIL). Der Trick besteht darin, dass diese Aufzeichnungen auch verbleiben im Speicher und werden zusammen mit normalen asynchronen Schreibanforderungen aggregiert, um spĂ€ter als ganz normale TXGs (Transaktionsgruppen) in den Speicher geleert zu werden.

Im Normalbetrieb wird auf die ZIL geschrieben und nie wieder gelesen. Wenn nach wenigen Augenblicken die DatensĂ€tze aus der ZIL in gewöhnlichen TXGs aus dem RAM in den Hauptspeicher ĂŒbernommen werden, werden sie von der ZIL getrennt. Das einzige Mal, dass etwas aus der ZIL gelesen wird, ist, wenn der Pool importiert wird.

Wenn ZFS ausfĂ€llt – ein Betriebssystemabsturz oder ein Stromausfall –, wĂ€hrend Daten in der ZIL vorhanden sind, werden diese Daten beim nĂ€chsten Poolimport gelesen (z. B. beim Neustart des Notfallsystems). Alles in der ZIL wird gelesen, in TXGs gruppiert, in den Hauptspeicher ĂŒbertragen und dann wĂ€hrend des Importvorgangs von der ZIL getrennt.

Eine der vdev-Hilfsklassen heißt LOG oder SLOG, das sekundĂ€re GerĂ€t von LOG. Es hat einen Zweck: dem Pool ein separates und vorzugsweise viel schnelleres, sehr schreibresistentes vdev zur VerfĂŒgung zu stellen, um die ZIL zu speichern, anstatt die ZIL im Haupt-vdev-Speicher zu speichern. Das ZIL selbst verhĂ€lt sich gleich, egal wo es gespeichert ist, aber wenn das LOG-vdev eine sehr hohe Schreibleistung hat, sind synchrone SchreibvorgĂ€nge schneller.

Das HinzufĂŒgen eines vdev mit LOG zum Pool funktioniert nicht kann nicht Verbessern Sie die asynchrone Schreibleistung – auch wenn Sie alle SchreibvorgĂ€nge in ZIL erzwingen zfs set sync=always, werden sie weiterhin auf die gleiche Weise und im gleichen Tempo wie ohne Protokoll mit dem Hauptspeicher in TXG verknĂŒpft. Die einzige direkte Leistungsverbesserung ist die Latenz synchroner SchreibvorgĂ€nge (da eine schnellere Protokollierung die VorgĂ€nge beschleunigt). sync).

In einer Umgebung, die bereits viele synchrone SchreibvorgĂ€nge erfordert, kann vdev LOG jedoch indirekt asynchrone SchreibvorgĂ€nge und nicht zwischengespeicherte LesevorgĂ€nge beschleunigen. Das Auslagern von ZIL-EintrĂ€gen in ein separates vdev-LOG bedeutet weniger Konflikte um IOPS auf dem PrimĂ€rspeicher, was die Leistung aller Lese- und SchreibvorgĂ€nge in gewissem Maße verbessert.

SchnappschĂŒsse

Der Copy-on-Write-Mechanismus ist auch eine notwendige Grundlage fĂŒr atomare ZFS-Snapshots und inkrementelle asynchrone Replikation. Das aktive Dateisystem verfĂŒgt ĂŒber einen Zeigerbaum, der alle DatensĂ€tze mit aktuellen Daten markiert. Wenn Sie einen Schnappschuss erstellen, erstellen Sie einfach eine Kopie dieses Zeigerbaums.

Wenn ein Datensatz im aktiven Dateisystem ĂŒberschrieben wird, schreibt ZFS zunĂ€chst die neue Blockversion in ungenutzten Speicherplatz. Anschließend wird die alte Version des Blocks vom aktuellen Dateisystem getrennt. Wenn sich jedoch ein Snapshot auf den alten Block bezieht, bleibt dieser unverĂ€ndert. Der alte Block wird erst dann als freier Speicherplatz wiederhergestellt, wenn alle Snapshots, die auf diesen Block verweisen, zerstört sind!

Replikation

ZFS-Grundlagen: Speicher und Leistung
Meine Steam-Bibliothek im Jahr 2015 war 158 GiB groß und enthielt 126 Dateien. Dies kommt der optimalen Situation fĂŒr rsync ziemlich nahe – die ZFS-Replikation ĂŒber das Netzwerk war „nur“ 927 % schneller.

ZFS-Grundlagen: Speicher und Leistung
Im selben Netzwerk erfolgt die Replikation einer einzelnen 40 Gigabyte großen virtuellen Maschinenabbilddatei. Windows Bei Version 7 sieht die Sache ganz anders aus. Die ZFS-Replikation ist 289-mal schneller als rsync – oder „nur“ 161-mal schneller, wenn man rsync mit dem Parameter --inplace aufruft.

ZFS-Grundlagen: Speicher und Leistung
Wenn ein VM-Image skaliert wird, skalieren Rsync-Probleme mit. 1,9 TiB ist fĂŒr ein modernes VM-Image nicht so groß – aber groß genug, dass die ZFS-Replikation 1148-mal schneller als rsync ist, selbst mit dem Argument --inplace von rsync

Sobald Sie verstanden haben, wie Snapshots funktionieren, sollte es Ihnen leicht fallen, die Essenz der Replikation zu verstehen. Da ein Snapshot nur ein Baum von Zeigern auf DatensĂ€tze ist, folgt daraus, dass wir dies tun zfs send Snapshot, dann senden wir sowohl diesen Baum als auch alle damit verbundenen DatensĂ€tze. Wenn wir das verschicken zfs send ĐČ zfs receive Auf dem Ziel schreibt es sowohl den tatsĂ€chlichen Inhalt des Blocks als auch den Zeigerbaum, der auf die Blöcke verweist, in den Zieldatensatz.

Im zweiten Teil wird es noch interessanter zfs send. Wir haben jetzt zwei Systeme, jedes enthĂ€lt poolname/datasetname@1, und Sie machen einen neuen Schnappschuss poolname/datasetname@2. Daher haben Sie im ursprĂŒnglichen Pool datasetname@1 Đž datasetname@2, und im Zielpool bisher nur der erste Snapshot datasetname@1.

Da wir einen gemeinsamen Schnappschuss zwischen der Quelle und dem Ziel haben datasetname@1, Wir können es schaffen inkrementell zfs send darĂŒber. Wenn wir zum System sagen zfs send -i poolname/datasetname@1 poolname/datasetname@2Es vergleicht zwei ZeigerbĂ€ume. Alle Zeiger, die nur in existieren @2, beziehen sich offensichtlich auf neue Blöcke – wir benötigen also den Inhalt dieser Blöcke.

Auf einem Remote-System wird ein inkrementeller Vorgang verarbeitet send genauso einfach. Zuerst schreiben wir alle neuen EintrĂ€ge, die im Stream enthalten sind send, und fĂŒgen Sie dann Zeiger auf diese Blöcke hinzu. Voila, das haben wir @2 im neuen System!

Die asynchrone inkrementelle Replikation von ZFS ist eine enorme Verbesserung gegenĂŒber frĂŒheren, nicht auf Snapshots basierenden Methoden wie rsync. In beiden FĂ€llen werden nur geĂ€nderte Daten ĂŒbertragen – rsync muss aber vorher erfolgen lies die Von der Festplatte alle Daten auf beiden Seiten, um die Summe zu ĂŒberprĂŒfen und zu vergleichen. Im Gegensatz dazu liest die ZFS-Replikation nur ZeigerbĂ€ume – und alle Blöcke, die nicht im freigegebenen Snapshot vorhanden sind.

Integrierte Komprimierung

Der Copy-on-Write-Mechanismus vereinfacht auch das Inline-Komprimierungssystem. In einem herkömmlichen Dateisystem ist die Komprimierung problematisch – sowohl die alte als auch die neue Version der geĂ€nderten Daten befinden sich im selben Bereich.

Wenn wir ein Datenelement in der Mitte einer Datei betrachten, das zu Beginn ein Megabyte mit Nullen ab 0x00000000 usw. enthÀlt, ist es sehr einfach, es auf einen Sektor auf der Festplatte zu komprimieren. Aber was passiert, wenn wir dieses Megabyte an Nullen durch ein Megabyte inkompressibler Daten wie JPEG oder Pseudozufallsrauschen ersetzen? Unerwarteterweise erfordert dieses Megabyte an Daten nicht einen, sondern 256 4-KiB-Sektoren, und an dieser Stelle auf der Festplatte ist nur ein Sektor reserviert.

Bei ZFS gibt es dieses Problem nicht, da geĂ€nderte DatensĂ€tze immer in ungenutzten Speicherplatz geschrieben werden – der ursprĂŒngliche Block belegt nur einen 4-KiB-Sektor und der neue Datensatz belegt 256, aber das ist kein Problem – ein kĂŒrzlich geĂ€ndertes Fragment aus dem „ Mitte“ der Datei wĂŒrde in ungenutzten Speicherplatz geschrieben werden, unabhĂ€ngig davon, ob sich ihre GrĂ¶ĂŸe geĂ€ndert hat oder nicht, also ist dies bei ZFS eine ganz normale Situation.

Die native ZFS-Komprimierung ist standardmĂ€ĂŸig deaktiviert und das System bietet austauschbare Algorithmen – derzeit LZ4, gzip (1-9), LZJB und ZLE.

  • LZ4 ist ein Streaming-Algorithmus, der fĂŒr die meisten AnwendungsfĂ€lle extrem schnelle Komprimierung und Dekomprimierung sowie Leistungsvorteile bietet – selbst auf relativ langsamen CPUs.
  • GZIP ist ein ehrwĂŒrdiger Algorithmus, den alle Unix-Benutzer kennen und lieben. Er kann mit den Komprimierungsstufen 1–9 implementiert werden, wobei das KomprimierungsverhĂ€ltnis und die CPU-Auslastung steigen, wenn man sich der Stufe 9 nĂ€hert. Der Algorithmus eignet sich gut fĂŒr alle Text- (oder andere stark komprimierbare) AnwendungsfĂ€lle, verursacht aber ansonsten oft CPU-Probleme – verwenden Sie ihn mit Vorsicht, insbesondere auf höheren Ebenen.
  • LZJB ist der ursprĂŒngliche Algorithmus in ZFS. Es ist veraltet und sollte nicht mehr verwendet werden, das LZ4 ĂŒbertrifft es in jeder Hinsicht.
  • FALSCH - Zero-Level-Codierung, Zero-Level-Codierung. Es berĂŒhrt normale Daten ĂŒberhaupt nicht, sondern komprimiert große Folgen von Nullen. NĂŒtzlich fĂŒr vollstĂ€ndig inkomprimierbare DatensĂ€tze (z. B. JPEG, MP4 oder andere bereits komprimierte Formate), da inkompressible Daten ignoriert werden, aber ungenutzter Speicherplatz in den resultierenden DatensĂ€tzen komprimiert wird.

Wir empfehlen die LZ4-Komprimierung fĂŒr fast alle AnwendungsfĂ€lle; Die Leistungseinbußen bei inkompressiblen Daten sind sehr gering Wachstum Die Leistungseinbußen bei typischen Daten sind erheblich. Kopieren eines virtuellen Maschinenabbilds fĂŒr eine neue Betriebssysteminstallation Windows (Frisch installiertes Betriebssystem, noch keine Daten enthalten) compression=lz4 27 % schneller bestanden als mit compression=noneIn diesen Test im Jahr 2015.

ARC – adaptiver Ersatzcache

ZFS ist das einzige uns bekannte moderne Dateisystem, das seinen eigenen Lese-Caching-Mechanismus verwendet, anstatt sich auf den Seitencache des Betriebssystems zu verlassen, um Kopien kĂŒrzlich gelesener Blöcke im RAM zu speichern.

Auch wenn der native Cache nicht ohne Probleme ist – ZFS kann nicht so schnell auf neue Speicherzuweisungsanfragen reagieren wie der Kernel, also die neue Herausforderung malloc() bei der Speicherzuweisung kann fehlschlagen, wenn der aktuell von ARC belegte RAM benötigt wird. Aber es gibt gute GrĂŒnde, zumindest vorerst einen eigenen Cache zu verwenden.

Alle bekannten modernen Betriebssysteme, einschließlich MacOS, Windows, Linux BSD verwendet den LRU-Algorithmus (Least Recently Used) zur Implementierung des Seitencaches. Dieser einfache Algorithmus verschiebt nach jedem Lesevorgang einen zwischengespeicherten Block an den Anfang der Warteschlange und entfernt bei Bedarf Blöcke ans Ende der Warteschlange, um neue Cache-Fehler (Blöcke, die von der Festplatte statt aus dem Cache gelesen werden sollten) oben einzufĂŒgen.

Der Algorithmus funktioniert normalerweise gut, aber auf Systemen mit großen ArbeitsdatensĂ€tzen fĂŒhrt LRU leicht zu Thrashing – dem Entfernen hĂ€ufig benötigter Blöcke, um Platz fĂŒr Blöcke zu schaffen, die nie wieder aus dem Cache gelesen werden.

ARC ist ein viel weniger naiver Algorithmus, den man sich als „gewichteten“ Cache vorstellen kann. Jedes Mal, wenn ein zwischengespeicherter Block gelesen wird, wird er etwas „schwerer“ und schwieriger zu entfernen – und das sogar nach dem Entfernen eines Blocks verfolgt innerhalb einer bestimmten Zeitspanne. Ein Block, der entfernt wurde, dann aber wieder in den Cache eingelesen werden muss, wird ebenfalls „schwerer“.

Das Endergebnis all dessen ist ein Cache mit einer viel höheren Trefferquote, dem VerhĂ€ltnis zwischen Cache-Hits (aus dem Cache durchgefĂŒhrten LesevorgĂ€ngen) und Cache-Misses (LesevorgĂ€ngen von der Festplatte). Dies ist eine Ă€ußerst wichtige Statistik – nicht nur, dass die Cache-Treffer selbst um GrĂ¶ĂŸenordnungen schneller bedient werden, auch Cache-Fehltreffer können schneller bedient werden, denn je mehr Cache-Treffer es gibt, desto weniger gleichzeitige Festplattenanfragen und desto geringer ist die Latenz fĂŒr die verbleibenden Misses Das muss mit der Festplatte bedient werden.

Fazit

Nachdem wir die grundlegende Semantik von ZFS kennengelernt haben – wie Copy-on-Write funktioniert, sowie die Beziehungen zwischen Speicherpools, virtuellen GerĂ€ten, Blöcken, Sektoren und Dateien – sind wir bereit, die reale Leistung mit realen Zahlen zu diskutieren.

Im nĂ€chsten Abschnitt werden wir die tatsĂ€chliche Leistung von Pools mit gespiegelten VDEVs und RAIDz im Vergleich zueinander sowie im Vergleich zu traditionellen Kernel-RAID-Topologien betrachten. Linuxdie wir recherchiert haben frĂŒher.

Zuerst wollten wir nur die Grundlagen – die ZFS-Topologien selbst – behandeln, aber danach wie Bereiten wir uns darauf vor, ĂŒber die erweiterte Einrichtung und Optimierung von ZFS zu sprechen, einschließlich der Verwendung zusĂ€tzlicher VDEV-Typen wie L2ARC, SLOG und Special Allocation.

Source: habr.com

Kaufen Sie zuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz und VPS-VDS-Servern đŸ”„ Kaufen Sie zuverlĂ€ssiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server | ProHoster