Ich weiß, dass die Leistung von ZFS stark von der Größe des freien Speicherplatzes abhängt:
Halten Sie den Poolbereich unter 80%, um die Poolleistung aufrechtzuerhalten. Derzeit kann sich die Poolleistung verschlechtern, wenn ein Pool sehr voll ist und Dateisysteme häufig aktualisiert werden, z. B. auf einem ausgelasteten Mailserver. Volle Pools können zu Leistungseinbußen führen, es gibt jedoch keine weiteren Probleme. [...] Bedenken Sie, dass die Schreib-, Lese- und Resilver-Leistung selbst bei meist statischen Inhalten im Bereich von 95 bis 96% leiden kann. ZFS_Best_Practices_Guide, solarisinternals.com (archive.org)
Angenommen, ich habe einen 10T-Pool für raidz2, der ein ZFS-Dateisystem hostet volume
. Jetzt erstelle ich ein untergeordnetes Dateisystem volume/test
und gebe ihm eine Reservierung von 5T.
Dann mounte ich beide Dateisysteme per NFS auf einen Host und erledige einige Arbeiten. Ich verstehe, dass ich nicht volume
mehr als 5T schreiben kann , da die restlichen 5T reserviert sind volume/test
.
Meine erste Frage ist, wie wird die Leistung sinken, wenn ich meinen volume
Einhängepunkt mit ~ 5T fülle ? Wird es gelöscht, weil in diesem Dateisystem kein freier Speicherplatz für ZFS-Copy-on-Write und andere Meta-Inhalte vorhanden ist? Oder bleibt es gleich, da ZFS den freien Platz innerhalb des reservierten Platzes nutzen kann volume/test
?
Nun die zweite Frage . Macht es einen Unterschied, wenn ich das Setup wie folgt ändere? volume
hat jetzt zwei Dateisysteme volume/test1
und volume/test2
. Beide erhalten jeweils eine 3T-Reservierung (jedoch keine Quoten). Angenommen, ich schreibe 7T an test1
. Ist die Leistung für beide Dateisysteme gleich oder ist sie für jedes Dateisystem unterschiedlich? Wird es fallen oder gleich bleiben?
Vielen Dank!
volume
auf 8.5T beschränke und nie wieder darüber nachdenke. Ist das korrekt?Der Leistungsabfall tritt auf, wenn Ihr Zpool entweder sehr voll oder sehr fragmentiert ist. Der Grund dafür ist der Mechanismus der Erkennung freier Blöcke, der mit ZFS verwendet wird. Im Gegensatz zu anderen Dateisystemen wie NTFS oder ext3 gibt es keine Block-Bitmap, die anzeigt, welche Blöcke belegt und welche frei sind. Stattdessen unterteilt ZFS Ihr zvol in (normalerweise 200) größere Bereiche, die als "Metaslabs" bezeichnet werden, und speichert AVL-Bäume 1 mit freien Blockinformationen (Space Map) in jedem Metaslab. Der ausgeglichene AVL-Baum ermöglicht eine effiziente Suche nach einem Block, der der Größe der Anforderung entspricht.
Obwohl dieser Mechanismus aus Gründen der Skalierbarkeit gewählt wurde, stellte er sich leider auch als großer Schmerz heraus, wenn ein hoher Grad an Fragmentierung und / oder Raumnutzung auftritt. Sobald alle Metaslabs eine signifikante Datenmenge enthalten, erhalten Sie eine große Anzahl kleiner Bereiche mit freien Blöcken im Gegensatz zu einer kleinen Anzahl großer Bereiche, wenn der Pool leer ist. Wenn ZFS dann 2 MB Speicherplatz zuweisen muss, beginnt es mit dem Lesen und Auswerten aller Speicherplatzzuordnungen von Metaslabs, um entweder einen geeigneten Block zu finden oder eine Möglichkeit zu finden, die 2 MB in kleinere Blöcke aufzuteilen. Dies dauert natürlich einige Zeit. Was noch schlimmer ist, ist die Tatsache, dass es eine ganze Reihe von E / A-Operationen kosten wird, da ZFS tatsächlich alle Speicherplatzzuordnungen von den physischen Datenträgern lesen würde . Für irgendeinen Ihrer Schreiben.
Der Leistungsabfall kann erheblich sein. Wenn Sie Lust auf schöne Bilder haben, werfen Sie einen Blick auf den Blog-Post bei Delphix, in dem einige Zahlen aus einem (stark vereinfachten, aber dennoch gültigen) ZFS-Pool entnommen wurden. Ich klaue schamlos eines der Diagramme - sehen Sie sich die blauen, roten, gelben und grünen Linien in diesem Diagramm an, die Pools mit einer Kapazität von 10%, 50%, 75% und 93% gegen den Schreibdurchsatz in darstellen KB / s, während sie im Laufe der Zeit fragmentiert werden:
Eine schnelle und schmutzige Lösung dafür war traditionell der Metaslab-Debugging- Modus (nur
echo metaslab_debug/W1 | mdb -kw
zur Laufzeit verfügbar, um die Einstellung sofort zu ändern). In diesem Fall werden alle Speicherplatzzuordnungen im RAM des Betriebssystems gespeichert, sodass bei jedem Schreibvorgang keine übermäßigen und teuren E / A-Vorgänge erforderlich sind. Letztendlich bedeutet dies auch, dass Sie mehr Speicher benötigen, insbesondere für große Pools. Dies ist also eine Art RAM für die Speicherung des Pferdehandels. Ihr 10-TB-Pool kostet Sie wahrscheinlich 2-4 GB Speicher 2 , aber Sie können ihn ohne großen Aufwand auf 95% der Auslastung bringen.1 es ist etwas komplizierter, wenn Sie interessiert sind, schauen Sie sich Bonwicks Beitrag auf Weltraumkarten für Details an
2 Wenn Sie eine Möglichkeit zum Berechnen einer Obergrenze für den Speicher benötigen, ermitteln Sie mithilfe
zdb -mm <pool>
von die Anzahl dersegments
aktuell verwendeten Speicher in jedem Metaslab und dividieren Sie sie durch zwei, um ein Worst-Case-Szenario zu modellieren. Auf jedes belegte Segment folgt ein freies ), multiplizieren Sie es mit der Datensatzgröße für einen AVL-Knoten (zwei Speicherzeiger und ein Wert, angesichts der 128-Bit-Natur von zfs und der 64-Bit-Adressierung würden sich 32 Byte summieren, obwohl die Leute im Allgemeinen 64 Byte für einige annehmen Grund).Hinweis: Die grundlegende Gliederung ist in diesem Beitrag von Markus Kovero auf der zfs-discussion-Mailingliste enthalten , obwohl er meiner Meinung nach einige Fehler in seiner Berechnung gemacht hat, die ich hoffentlich in meiner korrigiert habe.
quelle