Was ist Deduplizierung in OpenZFS?
- Definition der Deduplizierung: In OpenZFS wird vor dem Schreiben von Daten auf die Festplatte geprüft, ob diese Daten bereits auf der Festplatte vorhanden sind. Falls ja, wird kein neuer Schreibvorgang durchgeführt, sondern stattdessen ein Verweis auf die bestehende Kopie hinzugefügt.
- Herausforderungen der Deduplizierung: Es ist schwierig festzustellen, ob sich die Daten bereits auf der Festplatte befinden und wo sie liegen. Das erfordert zusätzliche Ein-/Ausgabevorgänge (IO), was zu Leistungseinbußen führen kann.
Wie funktioniert Deduplizierung?
- Funktionsweise: Wenn Deduplizierung aktiviert ist, wird ein Datenblock vorbereitet und eine Prüfsumme berechnet. Früher hat der Metaslab-Allokator Speicherplatz zugewiesen, bei aktivierter Deduplizierung wird die Prüfsumme jedoch in der Deduplizierungstabelle nachgeschlagen.
- Deduplizierungstabelle: Sie wird in Form einer Hashtabelle gespeichert, die die Prüfsumme als Schlüssel sowie die Position auf der Festplatte und die Referenzanzahl als Werte verwendet. Sie gilt als Teil der Pool-Metadaten.
Probleme der traditionellen Deduplizierung
- Probleme der Deduplizierungstabelle: Die traditionelle Deduplizierung wird in OpenZFS mithilfe des On-Disk-Hashtabellenobjekts implementiert. Das ist eine komplexe Struktur und für Anwendungen wie Deduplizierung nicht besonders geeignet.
- Speicherverbrauch: Das Lesen der Deduplizierungstabelle wird im ARC zwischengespeichert; mit ausreichend RAM lässt sich der Leseanteil bei Tabellenaktualisierungen reduzieren.
- Problem mit eindeutigen Einträgen: Der Platzbedarf für das Verfolgen eindeutiger Einträge in der Deduplizierungstabelle ist problematisch. Blöcke mit einer Referenzanzahl von 1 belegen Platz in der Deduplizierungstabelle, und wenn dieselben Daten nicht erneut geschrieben werden, lässt sich dieser Aufwand nicht wieder hereinholen.
Wie löst Fast Dedup diese Probleme?
- Verkleinerung der Liste aktiver Einträge: Um den Speicherverbrauch zu senken, wird der Speicher-Footprint der Liste aktiver Einträge reduziert. In der neuen Deduplizierungstabelle schrumpft der „Wert“-Teil eines Eintrags auf 72 Byte.
- Deduplizierungs-Log: Anstelle einer Liste aktiver Einträge wird ein Log verwendet, um Änderungen aufzuzeichnen; bei der Wiederherstellung nach einem Absturz wird dieses Log erneut abgespielt. Das Log wird im Speicher gehalten, um schnelle Nachschläge zu ermöglichen.
- Inkrementelles Log-Flushing: Um die Größe des Logs zu kontrollieren, wird bei jeder Transaktion ein Teil des Logs in ZAP geschrieben. Bei Speicherdruck wird das Flushing des Logs beschleunigt.
Zusammenfassung von GN⁺
- Die neue Funktion „FastDedup“ in OpenZFS wurde entwickelt, um die Probleme der traditionellen Deduplizierung zu lösen. Sie reduziert den Speicherverbrauch und ermöglicht durch Logs ein effizienteres Datenmanagement.
- Deduplizierung ist nur für bestimmte Workloads sinnvoll und kann für allgemeine Zwecke weiterhin ineffizient sein. Der Grund dafür ist der hohe Verwaltungs-Overhead der Deduplizierungstabelle.
- Ein anderes Projekt mit ähnlicher Funktion ist die Deduplizierung von Btrfs, die in anderen Dateisystemen eine Alternative sein kann.
1 Kommentare
Hacker-News-Kommentare
Die Überschrift hat mich zum Klicken gebracht, aber obwohl ich mich nicht für ZFS interessiere, habe ich am Ende fast den ganzen Artikel gelesen. Er war klar erklärt, und das mobile CSS-Theme hat mir besonders gut gefallen. Eine knappe Zusammenfassung steht am Ende des Artikels.
Abgesehen von der
copy_file_range-Diskussion wäre es schön, wenn man im Dateisystem Dateien ab 1 MB mit identischem Hash finden und selektiv Deduplizierung darauf anwenden könnte.Das Problem traditioneller Deduplizierung ist, dass der Overhead zu hoch ist und sie sich außer bei bestimmten Workloads kaum lohnt. Auf Pure- und Dell/EMC-Arrays habe ich bei VMWare-Workloads Einsparungen durch Deduplizierung/Komprimierung von 3:1 gesehen.
Die Wirkung von Deduplizierung hängt stark von der Größe der gehashten Blöcke ab. Je kleiner die Blöcke, desto höher die Wahrscheinlichkeit passender Blöcke. Ich persönlich bevorzuge eine Blockgröße von 4 KB.
Ich hätte gern „Offline“-Deduplizierung oder „faule“ Deduplizierung. Wenn Deduplizierung aktiviert ist, erfordern alle Schreib- und Freigabevorgänge Nachschlagen und Schreiben in die Deduplizierungstabelle. Beim Schreiben von Daten möchte ich, dass es schnell abgeschlossen wird.
Ich freue mich sehr auf schnelle Deduplizierung. Ich wollte ZFS-Deduplizierung schon für ArchiveBox-Daten verwenden. Es scheint möglich zu werden, viele URLs zu archivieren und das Dateisystem alles komprimieren zu lassen.
Ich verwende ZFS-Deduplizierung für mein persönliches Archiv und reduziere den belegten Speicherplatz derzeit um das Dreifache. ZFS hat in Sachen Zuverlässigkeit sehr gut funktioniert und konnte Datenverlust verhindern.
Allgemeine Deduplizierung ist in der Theorie gut, funktioniert in der Praxis aber nicht besonders gut. IPFS versucht, Daten mit variabel großen Chunks zu deduplizieren, aber praktisch bringt das keinen Unterschied und erhöht nur die Komplexität.
Es wäre gut, wenn die dedizierte Hardware von Disk-Controllern so verbessert würde, dass sie dem System Block-Hashes für Berechnungen wie ECC offenlegen kann.
Ich wünschte, die API des Dateisystems hätte eine völlig andere Form. Die Dateisystem-APIs aller Betriebssysteme sind aus Kompatibilitätsgründen festgefahren.
Wenn Schreibperformance wichtig ist, muss man nicht beim Schreiben deduplizieren. Deduplizierung kann später, parallel und mit niedriger Priorität erfolgen.