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.

ZFS Deduplizierung vereinfacht dargestellt
ZFS Deduplizierung vereinfacht dargestellt

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

Hab ich was vergessen? Fehlen dir Informationen? Benötigst du trotzdem noch Hilfe bei diesem Thema? Dann ab in die Kommentare oder schreib mir eine Nachricht.

Dennis Schröder // Geiler typ