Jeder der ZFS schon mal irgendwo gelesen oder gehört hat, hat auch von Deduplizierung gehört. Der Name lässt es schon vermuten, irgendetwas auf dem Speicherbereich wird Dupliziert und mit der Verneinung „De-„, eben „Nicht“ Dupliziert. Klingt jetzt zunächst kompliziert, ist aber ganz einfach. Kernaussage: Du kannst unter Umständen einiges an Speicherplatz sparen.
Am besten ein einfaches Beispiel was jeder kapiert
Man stelle sich vor man hat auf einem Dateisystem 2 gleich Dateien liegen. Meinetwegen 2x die selbe ISO-Datei, nur mit einem unterschiedlichen Namen und in verschiedenen Ordnern. Schlaue Dateisysteme wie ZFS oder BTRFS, bringen durch Ihre Konstruktionsweise die Möglichkeit mit Datenblöcke auf Speicherebene zu vergleichen. Heißt, ZFS erkennt jetzt auf Blockebene das da „die gleichen“ Daten abgelegt sind und speichert alles nur 1x im System und an der zweiten stelle fügt es lediglich einen Verweis ein. Das ist natürlich für euch komplett transparent, da dieser Vorgang unten auf Blockebene verarbeitet wird. Trotzdem entsteht hierdurch jetzt ein Speichervorteil, da die oben genannte ISO-Datei zu 99% nur 1x gespeichert werden muss.
Also überall da wo sich viele Dateien ähneln (Auf Blockebene), kann ZFS mit aktivierter Deduplizierung einiges an Speicherplatz sparen.
Jetzt ein wenig mehr ins technische Detail
Alles was oben steht klingt erstmal verlockend und möchte man umgehend einsetzen und fleißig Speicherplatz sparen. Kann ich sehr gut verstehen.
Wissen sollte man aber zunächst ZFS hält sich die Prüfsummen der bereits geschriebenen Datenblöcke im RAM vor. Nur so kann On-the-fly (Inline-Deduplication) verglichen werden ob es sich bei den gerade neu rein kommenden Daten um bereits vorhandene Daten handelt oder um bereits bestehende. Ihr merkt jetzt, ZFS behält sich vor eine Prüfsummentabelle im RAM aufzubewahren und bei neu rein kommenden Daten diese damit zu vergleichen. Was passiert.. euer RAM wird voller und eure CPU benötigt Zeit die Prüfsummen Tabelle zu durchsuchen. Wollen wir das? NEIN
Wir kommen der Frage näher ob sich die Deduplizierung dann überhaupt lohnt wenn meine CPU arbeiten muss, mein RAM benutzt wird und ich evtl. beim Schreiben von Daten mit Performanceeinbußen rechnen muss.
Wann lohnt sich Deduplizierung? Wo ist der Einsatz sinnvoll?
Deduplizierung lohnt sich ganz klar an Stellen wo wirklich viele Daten gleich sind. Zum Beispiel in Virtualisierungsumgebungen, in Filesystemen zur Dateiablage und überall da wo immer fast gleiche wiederkehrende Daten mehrfach abgelegt werden, z.B. Backups.
Wie hoch ist der RAM Verbrauch?
Einfach ausgedrückt: ~ 5GB RAM pro 1TB nutzbare Kapazität
Kompliziert und genauer: Anzahl Blöcke * DDT (ca. 320 Byte) = RAM-Verbrauch
Wie viel Platz kann ich jetzt einsparen?
Das kann man zum Glück vor dem Einschalten der Deduplizierung überprüfen und sich anzeigen lassen, was die zu erwartende Deduplizierungsrate sein wird. Die Daten müssen dafür natürlich bereits auf einem ZFS Dateisystem liegen.
zdb -S ZFS_Data Simulated DDT histogram: bucket allocated referenced ______ ______________________________ ______________________________ refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE ------ ------ ----- ----- ----- ------ ----- ----- ----- 1 4.48M 98.9G 83.6G 84.0G 4.48M 98.9G 83.6G 84.0G 2 607K 5.67G 4.39G 4.43G 1.29M 12.3G 9.53G 9.60G 4 127K 1.65G 1.11G 1.15G 599K 8.14G 5.37G 5.58G 8 30.6K 752M 427M 452M 290K 6.57G 3.76G 4.01G 16 4.31K 85.8M 52.0M 53.8M 94.6K 1.64G 1.04G 1.07G 32 1.49K 11.6M 10.1M 10.4M 68.3K 531M 463M 474M 64 584 3.88M 3.26M 3.57M 45.3K 303M 252M 279M 128 30 166K 85.5K 120K 5.27K 29.6M 15.2M 21.1M 256 4 2K 2K 16K 1.27K 648K 648K 5.07M 512 7 48.5K 24.5K 28K 4.26K 28.9M 14.6M 17.1M 1K 8 64K 32K 32K 10.8K 86.7M 43.3M 43.3M 2K 3 24K 12K 12K 9.49K 75.9M 38.0M 38.0M 8K 1 8K 4K 4K 10.9K 86.9M 43.5M 43.5M 16K 2 16K 8K 8K 42.1K 337M 169M 169M 128K 1 8K 4K 4K 159K 1.24G 637M 637M Total 5.23M 107G 89.6G 90.1G 7.07M 130G 105G 106G dedup = 1.18, compress = 1.24, copies = 1.01, dedup * compress / copies = 1.45
Der Befehl zdb -S <TANK> berechnet euch vorab die zu erwartenden Werte. Nicht nur die Deduplizierungsrate wird euch angezeigt, sondern auch direkt die Kompressionsrate.
Also Fazit, Einschalten oder Nicht ?
Ich möchte euch ungerne sagen es kommt darauf an, deswegen hier ein paar harte Fakten.
- Zu erwartende Deduplizierungsrate unter 1.5? – Lass es sein
- Du hast genügend RAM und deine CPU hat schon dampf? – Dedup einschalten
- Du willst dich einfach mal probieren? – Dedup einschalten
- Du bist dir weiter unsicher? – Dedup aus lassen und Kompression einschalten
- 100% Performance sind dir wichtig, 95% reichen dir nicht? – Lass es sein
- Du hast nur eine kleine SSDs oder NVMes (M.2) – Dedup einschalten
Ihr merkt, man muss sich probieren was nun das Richtige ist. DIE LÖSUNG gibt es in dieser Hinsicht hier nun wirklich nicht.
Ach sooo, wie schalte ich Dedup jetzt ein?
zfs set dedup=on <TANK>
ZFS im Überblick mit allen seinen Features mal aufgezeigt… diesen Beitrag findest du hier -> ZFS erklärt: Alle Funktionen des Dateisystems im Überblick
16. Juni 2022 um 08:52 Uhr
Ich finde es echt super, wie praxisbezogen Sie schreiben. Besonders der Abschnitt „Einschalten oder nicht“ ist hilfreich. Vielleicht sollte man noch klären, was „TANK“ bedeutet?
26. Juni 2022 um 16:19 Uhr
ist der Pool oder der Dataset für den Du die Deduplizierung aktivierst oder deaktivierst. Er hängt also von deinem Einsatzkontext ab.
26. Juni 2022 um 16:20 Uhr
Ok, Tags sind eine schlechte Idee.
Der Satz beginnt mit:
„TANK“ ist der Pool …