ZFS-Leistung: Muss in einem Pool oder Dateisystem freier Speicherplatz verfügbar sein?

17

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/testund 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 volumemehr als 5T schreiben kann , da die restlichen 5T reserviert sind volume/test.

Meine erste Frage ist, wie wird die Leistung sinken, wenn ich meinen volumeEinhä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? volumehat jetzt zwei Dateisysteme volume/test1und 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!

Pavel
quelle

Antworten:

9

Ja. Sie müssen freien Platz in Ihrem Pool behalten. Es ist hauptsächlich für Copy-on-Write-Aktionen und Snapshots gedacht. Die Leistung nimmt bei einer Auslastung von ca. 85% ab. Sie können höher gehen, aber es gibt eine bestimmte Auswirkung.

Leg dich nicht mit Reservierungen an. Vor allem mit NFS. Es ist nicht nötig. Vielleicht für ein zvol, aber nicht für NFS.

Ich sehe die Verwirrung jedoch nicht. Wenn Sie 10T haben, verwenden Sie nicht mehr als 85% davon. Passen Sie die Größe Ihrer Anteile an, indem Sie Quoten verwenden , um deren Verwendung zu begrenzen. Oder keine Quoten verwenden und Ihre allgemeine Überwachung Pool - Nutzung.

ewwhite
quelle
Vielen Dank! In unserer Einstellung gibt es keine faire Möglichkeit, Kontingente zu verwenden, sodass jeder denselben Einhängepunkt verwendet und den Platz ausfüllen kann, was zu Leistungseinbußen führt. Meine Idee war, mit einer Reservierung etwas freien Speicherplatz zu garantieren, damit das Gesamtsystem nie zu langsam wird. Aber IIUC, ich kann diese Garantie haben, indem ich volumeauf 8.5T beschränke und nie wieder darüber nachdenke. Ist das korrekt?
Pavel
Sie könnten ... oder einfach nur zuschauen. Ich meine, es ist NFS ... kein ZVOL, also können Sie Dateien löschen, um wieder unter 8,5 TB zu kommen.
Ewwhite
Ja, aber es tut weh, wenn diese Diskussionen in den Mailinglisten alle paar Wochen "Bitte räum deine Sachen auf ..., der Dateiserver ist furchtbar langsam" laut werden ...
Pavel
Technische Lösung für ein soziales / administratives Problem :) Erwarten Sie so viele Daten?
Ewwhite
Hehe .. Ja, das ist eine ziemlich häufige Situation, mit der wir konfrontiert sind. Behauptungen wie diese lauten also: "Auf Dateisystemen mit vielen Dateierstellungen und -löschungen sollte die Auslastung zum Schutz der Leistung unter 80% gehalten werden." unpräzise, ​​weil es wirklich um den freien Speicherplatz innerhalb eines Pools geht und nicht um das Dateisystem?
Pavel
21

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: zpool Leistungsabfall

Eine schnelle und schmutzige Lösung dafür war traditionell der Metaslab-Debugging- Modus (nur echo metaslab_debug/W1 | mdb -kwzur 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 der segmentsaktuell 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).

zdb -mm tank | awk '/segments/ {s+=$2}END {s*=32/2; printf("Space map size sum = %d\n",s)}'

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.

das-wabbit
quelle
syneticon-dj, danke für diese erklärung! Das Erhöhen des RAM scheint in der Tat zu helfen.
Pavel
Was ist mit BPR (Block Pointer Rewrite)? Auch dieses blogs.kent.ac.uk/unseenit/2013/10/02/… erwähnt, dass die Verwendung eines SLOG für ZIL ebenfalls hilfreich ist. Und dieser Typ nex7.blogspot.com.au/2013/03/readme1st.html sagt, dass Sie nur senden und empfangen, bis alles in Ordnung ist .
CMCDragonkai
@CMCDragonkai Aus Erfahrung kann ich Ihnen versichern, dass die Verwendung eines separaten ZIL-Geräts aufgrund der Fragmentierung der Weltraumkarte keinen Einfluss auf die Leistung hat. Wenn Sie jedoch kein ZIL-Gerät besitzen, wird die Fragmentierung insgesamt zunehmen, und es ist wahrscheinlicher, dass das Problem bei einem geringeren Prozentsatz der Speicherplatznutzung auftritt. BPR ist immer noch Vaporware - es gibt keinen nachweisbaren Code, geschweige denn eine stabile Implementierung. Ein Sende-Empfangs - Zyklus ist in der Tat wahrscheinlich Hilfe bei der defragmentierte Pool bekommen, aber dies wird Ausfallzeiten für den Datensatz gesendet / empfangen bedeuten.
the-wabbit
Was ist, wenn Sie den Datensatz vor dem Senden / Empfangen auf eine andere Festplatte repliziert haben? Und dann einfach einen Sende-Empfangs-Zyklus für jede Platte drehen?
CMCDragonkai
@CMCDragonkai Sie können Ausfallzeiten kurz halten, indem Sie zuerst einen vollständigen Sendevorgang ausführen und anschließend mit inkrementellen Daten arbeiten. Aber Ausfallzeiten bleiben bestehen. Wenn Sie Ihre Datasets zufällig als Back-End-Speicher für Datenbanken oder Virtualisierung verwenden, kann es zu Ausfallzeiten kommen, auch wenn diese kurz sind. Außerdem benötigen Sie einen separaten, leeren Pool, damit dies funktioniert.
the-wabbit