ZFS-Grundlagen: Speicher und Leistung



In diesem FrĂŒhjahr haben wir bereits einige einfĂŒhrende Themen besprochen, z. B. wie Sie die Geschwindigkeit Ihrer Laufwerke ĂŒberprĂŒfen und was RAID ist . In der zweiten haben wir sogar versprochen, die Leistung verschiedener Multi-Disk-Topologien in ZFS weiter zu untersuchen. Dies ist das Dateisystem der nĂ€chsten Generation, das ĂŒberall implementiert wird: von Apple bis Ubuntu .

Nun, heute ist der beste Tag, um ZFS kennenzulernen, neugierige Leser. Beachten Sie jedoch, dass es nach einer konservativen EinschÀtzung des OpenZFS-Entwicklers Matt Arens "sehr kompliziert" ist.

Aber bevor wir zu den Zahlen kommen - und ich verspreche es -, mĂŒssen Sie fĂŒr alle Varianten der vosmidiskovoy ZFS-Konfiguration darĂŒber sprechen, wie ZFS Daten auf der Festplatte speichert.

Zpool, vdev und GerÀt



Dieses vollstĂ€ndige Pooldiagramm enthĂ€lt drei Hilfs-VDEVs, einen fĂŒr jede Klasse und vier fĂŒr RAIDz2. Normalerweise


gibt es keinen Grund, einen Pool unangemessener VDEV- Typen und -GrĂ¶ĂŸen zu erstellen. Wenn Sie möchten, hindert Sie nichts daran

, das ZFS-Dateisystem wirklich zu verstehen mĂŒssen Sie sich die tatsĂ€chliche Struktur genau ansehen. Erstens kombiniert ZFS traditionelle Ebenen der DatentrĂ€gerverwaltung und das Dateisystem. Zweitens wird beim Schreiben ein Transaktionskopiermechanismus verwendet. Diese Merkmale bedeuten, dass sich das System strukturell stark von normalen Dateisystemen und RAID-Arrays unterscheidet. Die ersten grundlegenden Bausteine, die zu verstehen sind: ein Speicherpool (zpool), ein virtuelles GerĂ€t (vdev) und ein reales GerĂ€t (GerĂ€t).

zpool


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

Die Redundanz von ZFS erfolgt auf der Ebene der virtuellen GerÀte, jedoch nicht auf der Ebene der Pools. Auf Poolebene gibt es absolut keine Redundanz. Wenn ein vdev-Laufwerk oder ein spezielles vdev verloren geht, geht der gesamte Pool verloren.

Moderne Speicherpools können den Verlust eines Cache- oder virtuellen GerĂ€teprotokolls ĂŒberleben - obwohl sie eine kleine Menge schmutziger Daten verlieren können, wenn sie das vdev-Protokoll wĂ€hrend eines Stromausfalls oder eines Systemabsturzes verlieren.

Es gibt ein weit verbreitetes MissverstĂ€ndnis, dass „DatenbĂ€nder“ (Streifen) von ZFS ĂŒber den gesamten Pool aufgezeichnet werden. Das ist nicht wahr. Zpool ist ĂŒberhaupt kein lustiges RAID0, sondern ein lustiges JBOD mit einem komplexen verĂ€nderbaren Verteilungsmechanismus.

Die DatensĂ€tze werden grĂ¶ĂŸtenteils entsprechend dem verfĂŒgbaren 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 Verwendung (Auslastung) von vdev berĂŒcksichtigt. Wenn ein virtuelles GerĂ€t erheblich stĂ€rker als das andere geladen ist (z. B. aufgrund der Leselast), wird es trotz des höchsten freien Speicherplatzkoeffizienten vorĂŒbergehend zum Schreiben ĂŒbersprungen.

Ein in moderne ZFS-Datensatzverteilungsmethoden integrierter Mechanismus zur Erkennung von Recycling kann die Latenz verringern und den Durchsatz in Zeiten ungewöhnlich hoher Last erhöhen - dies ist jedoch kein FreibriefunwillkĂŒrliches Mischen langsamer Festplatten und schneller SSDs in einem Pool. Solch ein ungleicher Pool arbeitet immer noch mit der Geschwindigkeit des langsamsten GerĂ€ts, das heißt, als ob es vollstĂ€ndig aus solchen GerĂ€ten zusammengesetzt wĂ€re.

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 zum einfachen Speichern von Daten 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, RAIDz1, RAIDz2, RAIDz3 oder Spiegel.

RAIDz1, RAIDz2 und RAIDz3 sind spezielle Variationen der sogenannten RAID-DoppelparitĂ€t (Diagonale). 1, 2 und 3 beziehen sich darauf, wie viele ParitĂ€tsblöcke fĂŒr jedes Datenband zugewiesen sind. Anstelle separater Festplatten fĂŒr die ParitĂ€t verteilen virtuelle RAIDz-GerĂ€te diese ParitĂ€t gleichmĂ€ĂŸig auf die Festplatten. Ein RAIDz-Array kann so viele Festplatten verlieren, wie es ParitĂ€tsblöcke enthĂ€lt. Wenn er einen anderen verliert, wird er scheitern und den Speicherpool mitnehmen.

In gespiegelten virtuellen GerĂ€ten (Spiegel vdev) wird jeder Block auf jedem GerĂ€t in vdev gespeichert. Obwohl es sich um die gĂ€ngigsten Spiegel mit zwei Breiten handelt, kann sich eine beliebige Anzahl von GerĂ€ten im Spiegel befinden. In großen Installationen werden hĂ€ufig dreifache GerĂ€te verwendet, um die Leseleistung und die Fehlertoleranz zu erhöhen. Der vdev-Spiegel kann jeden Fehler ĂŒberstehen, wĂ€hrend mindestens ein GerĂ€t in vdev weiterhin funktioniert.

Einzelne vdevs sind von Natur aus gefĂ€hrlich. Ein solches virtuelles GerĂ€t ĂŒberlebt einen einzelnen Fehler nicht - und wenn es als Speicher oder als spezielles vdev verwendet wird, fĂŒhrt sein Ausfall zur Zerstörung des gesamten Pools. Sei hier sehr, sehr vorsichtig.

Virtuelle CACHE-, LOG- und SPECIAL-Appliances können mit einer der oben genannten Topologien erstellt werden. Beachten Sie jedoch, dass der Verlust einer virtuellen SPECIAL-Appliance den Verlust eines Pools bedeutet. Daher wird eine ĂŒbermĂ€ĂŸige Topologie dringend empfohlen.

GerÀt


Dies ist wahrscheinlich der am einfachsten zu verstehende Begriff in ZFS - es handelt sich buchstÀblich um ein Block-DirektzugriffsgerÀt. Denken Sie daran, dass virtuelle GerÀte aus einzelnen GerÀten bestehen und der Pool aus virtuellen GerÀten besteht.

Festplatten - magnetisch oder Festkörper - sind die am hĂ€ufigsten verwendeten BlockgerĂ€te, die als vdev-Bausteine ​​verwendet werden. Es ist jedoch jedes GerĂ€t mit einem Handle in / dev geeignet, sodass Sie ganze Hardware-RAID-Arrays als separate GerĂ€te verwenden können.

Eine einfache Rohdatei ist eines der wichtigsten alternativen BlockgerĂ€te, aus denen vdev erstellt werden kann. Testen Sie Pools aus Dateien mit geringer Dichte - Eine sehr bequeme Möglichkeit, Poolbefehle zu ĂŒberprĂŒfen und festzustellen, wie viel Speicherplatz im Pool oder auf dem virtuellen GerĂ€t dieser Topologie verfĂŒgbar ist.


Sie können in wenigen Sekunden einen Testpool aus Dateien mit geringer Dichte erstellen. Vergessen Sie jedoch nicht, den gesamten Pool und seine Komponenten spÀter zu löschen.

Angenommen, Sie möchten einen Server auf acht Festplatten installieren und planen, 10-TB-Festplatten (~ 9300 GiB) zu verwenden. Sie sind sich jedoch nicht sicher, welche Die Topologie entspricht am besten Ihren Anforderungen. Im obigen Beispiel erstellen wir in Sekundenschnelle einen Testpool aus Dateien mit geringer Dichte - und jetzt wissen wir, dass RAIDz2 vdev von acht 10-TB-Laufwerken eine nĂŒtzliche KapazitĂ€t von 50 TiB bietet.

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

Nach dem Herstellen einer Verbindung zum betroffenen vdev empfÀngt das ErsatzgerÀt Kopien oder die Rekonstruktion von Daten, die sich auf dem fehlenden GerÀt befinden sollten. In herkömmlichem RAID wird dies als Neuerstellung bezeichnet, wÀhrend es in 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 Zeit zu verkĂŒrzen, in der eine vdev-Verschlechterung beobachtet wird. Nachdem der Administrator das ausgefallene vdev-GerĂ€t ersetzt hat, wird die Redundanz auf diesem permanenten GerĂ€t wiederhergestellt, und SPARE trennt sich von vdev und kehrt als Ersatz fĂŒr den gesamten Pool zurĂŒck.

DatensÀtze, Blöcke und Sektoren


Die nĂ€chsten Bausteine, die Sie auf unserer Reise durch ZFS verstehen mĂŒssen, sind nicht so sehr die Hardware, sondern die Organisation und Speicherung der Daten. Wir ĂŒberspringen hier mehrere Ebenen - wie z. B. Metaslab -, um die Details nicht zu hĂ€ufen und gleichzeitig das VerstĂ€ndnis der Gesamtstruktur zu bewahren.

Datensatz



Wenn wir zum ersten Mal ein Dataset erstellen, wird der gesamte verfĂŒgbare Poolbereich angezeigt. Dann legen wir das Kontingent fest - und Ă€ndern den EinhĂ€ngepunkt. Magie!


Zvol ist grĂ¶ĂŸtenteils nur ein Datensatz ohne Dateisystemschicht, den wir hier durch ein völlig normales ext4-

Dateisystem ersetzen. Der ZFS-Datensatz entspricht in etwa einem standardmĂ€ĂŸig bereitgestellten Dateisystem. Wie ein normales Dateisystem scheint es auf den ersten Blick „nur ein weiterer Ordner“ zu sein. Wie bei herkömmlichen gemounteten Dateisystemen verfĂŒgt auch jedes ZFS-Dataset ĂŒber eigene grundlegende Eigenschaften.

ZunÀchst kann einem Datensatz ein Kontingent zugewiesen werden. Wenn installiertzfs set quota=100G poolname/datasetname, können Sie nicht/poolname/datasetnamemehr als 100 GiBin den bereitgestellten Ordner schreiben.

Beachten Sie das Vorhandensein - und Fehlen - von SchrĂ€gstrichen am Anfang jeder Zeile? 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 Namen des Pools und dann mit dem Pfad von einem Datensatz zum nĂ€chsten. Zum Beispiel pool/parent/childfĂŒr ein Dataset, das childunter dem ĂŒbergeordneten Dataset parentin einem Pool mit einem Creative-Namen benannt ist pool.

StandardmĂ€ĂŸig wird die Mount - Punkt des Datensatz auf seinen Namen in der ZFS - Hierarchie entspricht, mit einem SchrĂ€gstrich am Anfang - der Pool mit dem Namen wird poolmontiert , wie /poolder Datensatz wird parentin montiert /pool/parent, und der Kind - Datensatz wird montiert childin /pool/parent/child. Der System-Mount-Punkt fĂŒr das Dataset kann jedoch geĂ€ndert werden.

Wenn wir angebenzfs set mountpoint=/lol pool/parent/child, dann wird der Datensatz pool/parent/childim System als gemountet /lol.

ZusĂ€tzlich zu DatensĂ€tzen sollten wir Volumes (zvols) erwĂ€hnen. Ein Volume Ă€hnelt ungefĂ€hr einem Datensatz, außer dass es tatsĂ€chlich kein Dateisystem hat - es ist nur ein BlockgerĂ€t. Sie können beispielsweise zvoleinen Namen erstellen mypool/myzvol, ihn dann mit dem ext4-Dateisystem formatieren und dann dieses Dateisystem bereitstellen - jetzt haben Sie das ext4-Dateisystem, aber mit UnterstĂŒtzung fĂŒr alle ZFS-Sicherheitsfunktionen! Dies mag auf einem Computer albern erscheinen, ist jedoch als Backend beim Exportieren eines iSCSI-GerĂ€ts viel sinnvoller.

Blöcke



Eine 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 recordsize , kann jedoch auf 2 ^ ashift reduziert werden, wenn sie Metadaten oder eine kleine Datei enthĂ€lt.


Wir scherzen wirklich, wirklich nicht ĂŒber den großen Leistungsschaden, wenn Sie zu wenig Ashift installieren.

Im ZFS-Pool werden alle Daten, einschließlich Metadaten, in Blöcken gespeichert. Die maximale BlockgrĂ¶ĂŸe fĂŒr jeden Datensatz wird in der Eigenschaftrecordsize(DatensatzgrĂ¶ĂŸe) definiert. Die GrĂ¶ĂŸe des Datensatzes kann variieren, dies Ă€ndert jedoch nicht die GrĂ¶ĂŸe oder Position von Blöcken, die bereits in das Dataset geschrieben wurden. Sie gelten nur fĂŒr neue Blöcke, wĂ€hrend sie geschrieben werden.

Sofern nicht anders angegeben, betrĂ€gt die aktuelle AufzeichnungsgrĂ¶ĂŸe standardmĂ€ĂŸig 128 KB. Dies ist eine Art schwieriger Kompromiss, bei dem die Leistung nicht ideal, aber in den meisten FĂ€llen nicht schrecklich ist. Recordsizekann auf einen beliebigen Wert von 4K bis 1M eingestellt werden (mit zusĂ€tzlichen Einstellungen können recordsizeSie noch mehr einstellen, dies ist jedoch selten eine gute Idee).

Jeder Block bezieht sich auf die Daten nur einer Datei. Sie können nicht zwei verschiedene Dateien in einem Block zusammenfassen. 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 einem kleineren Block 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 erfordert, haben alle DatensĂ€tze mit dieser Datei eine GrĂ¶ĂŸerecordsize - einschließlich des letzten Eintrags, von dem sich der grĂ¶ĂŸte Teil als ungenutzter Speicherplatz herausstellen kann .

Zvol-Volumes haben keine Eigenschaft, recordsize sondern eine entsprechende Eigenschaft volblocksize.

Sektoren


Der letzte, grundlegendste Baustein ist der Sektor. Dies ist die kleinste physische Einheit, die in die Basiseinheit geschrieben oder von dieser gelesen werden kann. Mehrere Jahrzehnte lang verwendeten die meisten Festplatten 512-Byte-Sektoren. In letzter Zeit sind die meisten Laufwerke fĂŒr 4-KiB-Sektoren und in einigen - insbesondere SSDs - 8-KiB-Sektoren oder sogar mehr konfiguriert.

ZFS verfĂŒgt ĂŒber eine Eigenschaft, mit der Sie die SektorgrĂ¶ĂŸe manuell festlegen können. Dies ist eine Eigenschaft ashift. Es ist etwas verwirrend, dass Ashift eine Zweierpotenz ist. Zum Beispiel ashift=9bedeutet dies eine SektorgrĂ¶ĂŸe von 2 ^ 9 oder 512 Bytes.

ZFS fragt das Betriebssystem nach detaillierten Informationen zu jedem BlockgerĂ€t, wenn es dem neuen vdev hinzugefĂŒgt wird, und stellt die Verschiebung basierend auf diesen Informationen theoretisch automatisch richtig ein. Leider lĂŒgen viele Festplatten ĂŒber ihre SektorgrĂ¶ĂŸe, um die KompatibilitĂ€t mit Windows XP aufrechtzuerhalten (das Festplatten mit anderen SektorgrĂ¶ĂŸen nicht verstehen konnte).

Dies bedeutet, dass dem ZFS-Administrator dringend empfohlen wird, die tatsĂ€chliche SektorgrĂ¶ĂŸe seiner GerĂ€te zu kennen und manuell zu installierenashift. Wenn eine zu kleine Verschiebung eingestellt ist, nimmt die Anzahl der Lese- / SchreibvorgĂ€nge astronomisch zu. Das Schreiben von 512-Byte-Sektoren in den realen 4-KiB-Sektor bedeutet also, den ersten „Sektor“ zu schreiben, dann den 4-KiB-Sektor zu lesen, ihn durch den zweiten 512-Byte-Sektor zu Ă€ndern, ihn in den neuen 4-KiB-Sektor zurĂŒckzuschreiben und so weiter fĂŒr jeden Eintrag.

In der realen Welt schlĂ€gt eine solche Strafe Samsung EVO- ashift=13SSDs , fĂŒr die sie handeln muss , aber diese SSDs liegen in Bezug auf ihre SektorgrĂ¶ĂŸe und sind daher standardmĂ€ĂŸig festgelegt ashift=9. Wenn ein erfahrener Systemadministrator diese Einstellung nicht Ă€ndert, ist diese SSD langsamer als eine normale magnetische Festplatte.

Zum Vergleich fĂŒr eine zu große GrĂ¶ĂŸeashiftEs gibt praktisch keine Strafe. Es gibt keine wirkliche Abnahme der ProduktivitĂ€t, und die Zunahme des nicht genutzten Speicherplatzes ist unendlich gering (oder gleich Null bei aktivierter Komprimierung). Wir empfehlen daher dringend, auch Laufwerke zu installieren, die wirklich 512-Byte-Sektoren verwenden, ashift=12oder sogar ashift=13sicher in die Zukunft zu schauen.

Die Eigenschaft wird ashiftfĂŒ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 ashiftbeim HinzufĂŒgen eines neuen vdev zum Pool versehentlich heruntergefahren wurden , haben Sie diesen Pool unwiderruflich mit einem GerĂ€t mit geringer Leistung kontaminiert. In der Regel gibt es keine andere Möglichkeit, als den Pool zu zerstören und von vorne zu beginnen. Selbst das Entfernen von vdev rettet Sie nicht vor einem fehlerhaften Setupashift!



 â€” ,


,


, , « » « »,


, — , ,

Copy on Write (CoW) ist die grundlegende Grundlage dafĂŒr, was ZFS so großartig macht. Das Grundkonzept ist einfach: Wenn Sie das herkömmliche Dateisystem bitten, die Datei zu Ă€ndern, wird es genau das tun, was Sie angefordert haben. Wenn Sie das Dateisystem mit dem Kopieren wĂ€hrend der Aufnahme auffordern, dasselbe zu tun, wird "gut" angezeigt - aber es wird Sie anlĂŒgen.

Stattdessen schreibt das Copy-Write-Dateisystem die neue Version des geÀnderten Blocks und aktualisiert dann die Dateimetadaten, um die Verbindung zum alten Block zu trennen und den neuen Block zuzuordnen, den Sie gerade geschrieben haben.

Das Trennen des alten GerĂ€ts und das Verbinden des neuen GerĂ€ts erfolgt in einem Arbeitsgang, sodass es nicht unterbrochen werden kann. Wenn Sie danach die Stromversorgung zurĂŒcksetzen, haben Sie eine neue Version der Datei. Wenn Sie die Stromversorgung frĂŒher zurĂŒcksetzen, haben Sie die alte Version. In jedem Fall liegt kein Konflikt im Dateisystem vor.

Das Kopieren beim Schreiben in ZFS erfolgt nicht nur auf Dateisystemebene, sondern auch auf DatentrÀgerverwaltungsebene. Dies bedeutet, dass ZFS keinem Leerzeichen im Datensatz unterliegt (einem Loch im RAID ) - ein PhÀnomen, bei dem der Strip vor dem Systemabsturz nur teilweise aufzeichnen konnte und das Array nach einem Neustart beschÀdigt wurde. Hier ist der Streifen atomar, vdev ist immer konsistent und Bob ist dein Onkel .

ZIL: ZFS-Absichtsprotokoll



ZFS  â€” , ZIL,


, ZIL, .


SLOG, LOG-, —  â€” , ,  â€” vdev, ZIL


ZIL  â€” ZIL SLOG,

Es gibt zwei Hauptkategorien von SchreibvorgĂ€ngen - synchron (synchron) und asynchron (asynchron). Bei den meisten Workloads ist die ĂŒberwiegende Mehrheit der SchreibvorgĂ€nge asynchron. Mit dem Dateisystem können Sie sie aggregieren und stapelweise bereitstellen, wodurch die Fragmentierung verringert und der Durchsatz erheblich erhöht wird.

Synchrone Aufnahmen sind eine ganz andere Sache. Wenn eine Anwendung ein synchrones Schreiben anfordert, teilt sie dem Dateisystem mit: "Sie mĂŒssen dies jetzt in den nichtflĂŒchtigen Speicher ĂŒbertragen , und bis dahin kann ich nichts mehr tun." Daher sollten synchrone Aufzeichnungen sofort auf die Festplatte ĂŒbertragen werden - und wenn dies die Fragmentierung erhöht oder die Bandbreite verringert, ist dies auch der Fall.

ZFS verarbeitet synchrone DatensÀtze anders als normale Dateisysteme. Anstatt sie sofort in den regulÀren Speicher hochzuladen, zeichnet ZFS sie in einem speziellen Speicherbereich auf, der als ZFS-Absichtsprotokoll - ZFS-Absichtsprotokoll oder ZIL - bezeichnet wird. Der Trick besteht darin, dass diese DatensÀtze auch im Speicher verbleiben und zusammen mit regulÀren asynchronen Schreibanforderungen aggregiert werden, um spÀter als ganz normale TXGs (Transaktionsgruppen, Transaktionsgruppen) gespeichert zu werden.

Im Normalbetrieb wird ZIL aufgezeichnet und nie wieder gelesen. Wenn nach einigen Augenblicken Aufzeichnungen von ZIL im Hauptspeicher in normalem TXG aus dem RAM fixiert werden, werden sie von ZIL getrennt. Das einzige, was aus ZIL gelesen wird, ist das Importieren des Pools.

Wenn ZFS abstĂŒrzt - BetriebssystemabstĂŒrze oder StromausfĂ€lle -, wenn Daten in ZIL vorhanden sind, werden diese Daten beim nĂ€chsten Poolimport gelesen (z. B. beim Neustart des Notfallsystems). Alles, was sich in der ZIL befindet, wird gelesen, in TXG-Gruppen zusammengefasst, in den Hauptspeicher ĂŒbernommen und dann wĂ€hrend des Importvorgangs von der ZIL getrennt.

Eine der vdev-Hilfsklassen heißt LOG oder SLOG, das sekundĂ€re LOG-GerĂ€t. Er hat eine Aufgabe - dem Pool ein separates und vorzugsweise viel schnelleres vdev-GerĂ€t mit sehr hohem Schreibwiderstand zum Speichern von ZIL zur VerfĂŒgung zu stellen, anstatt ZIL im vdev-Hauptspeicher zu speichern. ZIL selbst verhĂ€lt sich unabhĂ€ngig vom Speicherort gleich. Wenn jedoch vdev mit LOG eine sehr hohe Schreibleistung aufweist, sind synchrone SchreibvorgĂ€nge schneller.

Das HinzufĂŒgen von vdev mit LOG zum Pool kann die asynchrone Schreibleistung nicht verbessern. Selbst wenn Sie alle SchreibvorgĂ€nge in ZIL erzwingen zfs set sync=always, werden sie auf dieselbe Weise und im gleichen Tempo wie ohne Protokoll an das Hauptrepository in TXG gebunden. Die einzige direkte Leistungsverbesserung ist die Verzögerung bei der synchronen Aufzeichnung (da eine höhere Protokollgeschwindigkeit den Betrieb beschleunigt sync).

In einer Umgebung, in der bereits eine große Anzahl synchroner SchreibvorgĂ€nge erforderlich ist, kann vdev LOG jedoch indirekt asynchrone SchreibvorgĂ€nge und nicht zwischengespeicherte LesevorgĂ€nge beschleunigen. Das Hochladen von ZIL-DatensĂ€tzen in ein separates vdev-LOG bedeutet weniger Konkurrenz fĂŒr IOPS im PrimĂ€rspeicher, was die Leistung aller Lese- und SchreibvorgĂ€nge in gewissem Maße verbessert.

SchnappschĂŒsse


Der Schreibkopiermechanismus ist auch eine wesentliche 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 Snapshot erstellen, erstellen Sie einfach eine Kopie dieses Zeigerbaums.

Wenn ein Datensatz im aktiven Dateisystem ĂŒberschrieben wird, schreibt ZFS zuerst die neue Version des Blocks in den nicht verwendeten Speicherplatz. Anschließend wird die alte Version des Blocks vom aktuellen Dateisystem getrennt. Wenn sich ein Schnappschuss jedoch auf den alten Block bezieht, bleibt er unverĂ€ndert. Der alte Block wird erst dann als freier Speicherplatz wiederhergestellt, wenn alle Snapshots, die mit diesem Block verknĂŒpft sind, zerstört wurden!

Reproduzieren



Steam 2015 158  126 927 . rsync â€” ZFS « » 750% .


40- Windows 7 â€” . ZFS 289 , rsync â€” «» 161 , , rsync --inplace.


, rsync . 1,9  â€” , ZFS 1148 , rsync, rsync --inplace

Sobald Sie die Funktionsweise von Snapshots verstanden haben, können Sie die Essenz der Replikation leicht erfassen. Da ein Snapshot nur ein Baum von Zeigern auf DatensÀtze ist, zfs sendsenden wir diesen Baum und alle damit verbundenen DatensÀtze , wenn wir einen Snapshot erstellen. Wenn wir dies passieren zfs sendin zfs receiveauf das Zielobjekt, schreibt sie sowohl den eigentlichen Inhalt des Blocks und den Baum von Zeigern, die die Blöcke auf den Zieldatensatz verweisen.

Im zweiten wird alles noch interessanter zfs send. Jetzt haben wir zwei Systeme, von denen jedes enthĂ€lt poolname/datasetname@1, und Sie schießen einen neuen Schnappschuss poolname/datasetname@2. Daher haben Sie im Quellpool datasetname@1und datasetname@2und im Zielpool bisher nur den ersten Snapshot datasetname@1.

Da haben wir einen gemeinsamen Schnappschuss zwischen der Quelle und dem Zieldatasetname@1können wir inkrementell tun zfs send. Wenn wir dem System mitteilen zfs send -i poolname/datasetname@1 poolname/datasetname@2, werden zwei ZeigerbÀume verglichen. Alle Zeiger, die nur in vorhanden @2sind, beziehen sich offensichtlich auf neue Blöcke - daher benötigen wir den Inhalt dieser Blöcke.

Auf einem Remote-System ist die inkrementelle Verarbeitung sendgenauso einfach. Zuerst zeichnen wir alle neuen EintrĂ€ge auf, die im Stream enthalten sind send, und fĂŒgen dann Zeiger zu diesen Blöcken hinzu. Voila, in unserem @2neuen System!

Die asynchrone inkrementelle ZFS-Replikation ist eine enorme Verbesserung gegenĂŒber frĂŒheren Nicht-Snapshot-Methoden wie rsync. In beiden FĂ€llen werden nur geĂ€nderte Daten ĂŒbertragen - rsync muss jedoch zuerst gelesen werdenvon der Festplatte alle Daten auf beiden Seiten, um die Menge zu ĂŒberprĂŒfen und zu vergleichen. Im Gegensatz dazu liest die ZFS-Replikation nur ZeigerbĂ€ume - und alle Blöcke, die im allgemeinen Snapshot nicht dargestellt sind.

Inline-Komprimierung


Der Copy-on-Write-Mechanismus vereinfacht auch das integrierte 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 Sie ein Datenelement in der Mitte einer Datei betrachten, das sein Leben als Megabyte von Nullen ab 0x00000000 usw. beginnt, ist es sehr einfach, es auf einen Sektor auf der Festplatte zu komprimieren. Aber was passiert, wenn wir dieses Megabyte Nullen durch ein Megabyte inkompressibler Daten wie JPEG oder pseudozufÀlliges Rauschen ersetzen? Plötzlich benötigt dieses Megabyte an Daten nicht einen, sondern 256 Sektoren mit 4 KB, und an dieser Stelle auf der Festplatte ist nur ein Sektor reserviert.

ZFS hat kein solches Problem, da geĂ€nderte DatensĂ€tze immer in nicht verwendeten Speicherplatz geschrieben werden - der ursprĂŒngliche Block belegt nur einen 4-KiB-Sektor, und ein neuer Datensatz benötigt 256, dies ist jedoch kein Problem - ein kĂŒrzlich geĂ€ndertes Fragment aus der Mitte der Datei wĂŒrde in nicht verwendeten Speicherplatz geschrieben UnabhĂ€ngig davon, ob sich die GrĂ¶ĂŸe geĂ€ndert hat oder nicht, ist dies fĂŒr ZFS eine normale Situation.

Die integrierte ZFS-Komprimierung ist standardmĂ€ĂŸig deaktiviert und das System bietet Plug-In-Algorithmen - darunter 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 Leistungssteigerungen bietet - selbst auf relativ langsamen CPUs.
  • GZIP — , Unix-. 1-9, CPU 9. ( ) ,   c CPU â€” , .
  • LZJB — ZFS. , LZ4 .
  • ZLE - Zero Level Coding, Zero Level Coding. Es berĂŒhrt ĂŒberhaupt keine normalen Daten, komprimiert jedoch große Folgen von Nullen. NĂŒtzlich fĂŒr vollstĂ€ndig inkompressible DatensĂ€tze (z. B. JPEG, MP4 oder andere bereits komprimierte Formate), da inkompressible Daten ignoriert werden, jedoch nicht verwendeter Speicherplatz in den resultierenden DatensĂ€tzen komprimiert wird.

Wir empfehlen die LZ4-Komprimierung fĂŒr fast alle AnwendungsfĂ€lle. Die Leistungseinbuße fĂŒr inkompressible Daten zu begegnen ist sehr klein, und die LeistungsverstĂ€rkung fĂŒr typische Daten ist signifikant. Das Kopieren eines Images einer virtuellen Maschine fĂŒr eine Neuinstallation des Windows-Betriebssystems (frisch installiertes Betriebssystem, noch keine Daten darin) wurde in diesem Test 2015compression=lz4 27% schneller als mit bestanden .compression=none

ARC - adaptiver Ersatzcache


ZFS ist das einzige uns bekannte moderne Dateisystem, das einen eigenen Lese-Caching-Mechanismus verwendet und nicht auf den Seiten-Cache des Betriebssystems angewiesen ist, um Kopien kĂŒrzlich gelesener Blöcke im RAM zu speichern.

Obwohl der eigene Cache nicht ohne Probleme ist, kann ZFS nicht so schnell wie der Kernel auf neue Speicherzuweisungsanforderungen reagieren, sodass ein neuer malloc()Speicherzuweisungsaufruf möglicherweise fehlschlĂ€gt, wenn RAM benötigt wird, das derzeit von ARC belegt ist. Aber es gibt gute GrĂŒnde, zumindest vorerst einen eigenen Cache zu verwenden.

Alle bekannten modernen Betriebssysteme, einschließlich MacOS, Windows, Linux und BSD, verwenden den LRU-Algorithmus (Least Recent Used), um den Seitencache zu implementieren. Dies ist ein primitiver Algorithmus, der den zwischengespeicherten Block nach jedem Lesen in die Warteschlange stellt und die Blöcke in der Warteschlange nach Bedarf verschiebt, um neue Cache-Fehler (Blöcke, die von der Festplatte und nicht vom Cache gelesen werden sollten) hinzuzufĂŒgen.

Normalerweise funktioniert der Algorithmus einwandfrei, aber auf Systemen mit großen ArbeitsdatensĂ€tzen fĂŒhrt LRU leicht zu Thrashing - VerdrĂ€ngung hĂ€ufig benötigter Blöcke, um Platz fĂŒr Blöcke zu schaffen, die nie wieder aus dem Cache gelesen werden.

BOGEN - ein viel weniger naiver Algorithmus, der als "gewichteter" Cache betrachtet werden kann. Nach jedem Lesen des zwischengespeicherten Blocks wird es etwas „schwerer“ und es wird schwieriger, sich zu verdrĂ€ngen - und selbst nach dem VerdrĂ€ngen wird der Block fĂŒr einen bestimmten Zeitraum verfolgt . Ein Block, der herausgedrĂŒckt wurde, dann aber in den Cache zurĂŒckgelesen werden muss, wird ebenfalls "schwerer".

Das Endergebnis all dessen ist ein Cache mit einer viel grĂ¶ĂŸeren Trefferquote - dem VerhĂ€ltnis zwischen Treffern im Cache (aus dem Cache gelesen) und Fehlern (von der Festplatte gelesen). Dies ist eine Ă€ußerst wichtige Statistik. Der Cache trifft nicht nur selbst Service-GrĂ¶ĂŸenordnungen schneller, Cache-Misses können auch schneller bedient werden. Je mehr Cache-Hits, desto weniger gleichzeitige Festplattenanforderungen und desto geringer die Verzögerung fĂŒr die verbleibenden Misses, die bedient werden sollen Fahrt.

Fazit


Nachdem wir uns mit der grundlegenden Semantik von ZFS befasst haben - wie das Kopieren beim Schreiben funktioniert - sowie mit den Beziehungen zwischen Speicherpools, virtuellen GerÀten, Blöcken, Sektoren und Dateien, können wir die tatsÀchliche Leistung mit realen Zahlen diskutieren.

Im nÀchsten Teil werden wir die tatsÀchliche Leistung von Pools mit gespiegeltem vdev und RAIDz im Vergleich untereinander sowie im Vergleich zu herkömmlichen Linux-Kernel-RAID-Topologien untersuchen, die wir zuvor untersucht haben .

Zuerst wollten wir nur die Grundlagen betrachten - die ZFS - Topologien selbst - aber nach dieser werden wir bereit sein , ĂŒber Fortgeschrittene ZFS - Tuning und Tuning zu sprechen, einschließlich der Verwendung von Hilfs vdev Typen wie L2ARC, SLOG und Sonder Allocation.

All Articles