ZFS Deduplizierung in lokalen Pools auf Proxmox VE

Sollte man Deduplizierung in lokalen Pools auch für Hypervisoren wie Proxmox VE nutzen? In diesem Blogbeitrag beleuchten wir diese Frage genauer.

Deduplizierung ist eine fantastische Technologie, um Speicherplatz zu sparen, indem redundante Daten eliminiert werden. So ist es möglich, Speicherplatz zu sparen, was sich wiederum in niedrigeren Kosten für Speicher niederschlägt. Unter Proxmox Produkten lässt sich ZFS als lokales Speichersystem verwenden, beispielsweise als root-Filesystem und/oder auch für VM- oder Container-Images.

Was ist ein lokaler Pool?

In Bezug auf ZFS bezieht sich ein lokaler Pool auf Disk-/SSD-NVMe-Speicher, der direkt im Hypervisor eingebaut ist oder zumindest nur mit diesem Hypervisor verbunden ist (DAS / Direct-Attached-Storage). In der Regel umfasst ein lokaler ZFS Pool eine oder mehrere Storage Devices (also Disks oder SSDs/NVMes). Die Daten darauf stehen nur diesem einen Hypervisor zur Verfügung.

Funktionsweise der ZFS Deduplizierung

ZFS ist ein modernes Dateisystem, das eine effiziente Deduplizierung auf Blockebene ermöglicht. Stellen Sie sich das wie folgt vor: Jeder Datenblock wird mit einem eindeutigen Fingerabdruck, einem sogenannten Hash, versehen. Diese Hashes werden in der ZFS DeDuplicationTable (DDT) gespeichert. Wenn ein neuer Block geschrieben wird, berechnet ZFS den Hash dazu und vergleicht ihn mit den Einträgen in der Tabelle. Ist der Hash bereits vorhanden, wird der Block nicht erneut gespeichert, sondern es wird lediglich ein Verweis auf den bestehenden Block angelegt. Man benötigt nur noch ein paar Byte zusätzlich statt des gesamten Blocks, der bis zu mehreren Megabyte groß sein kann. So wird die doppelte Speicherung gleicher Blöcke vermieden.

Die Hash Tabelle wird in den Metadaten des ZFS Pools gespeichert und teilweise im ARC Cache (RAM) vorgehalten. Um die Deduplizierung in Echtzeit durchführen zu können, benötigt ZFS möglichst schnellen Zugriff auf die Hash Tabellen, idealerweise also auf schnelle NVMe-SSDs oder viel RAM um einen großteil des DDT im ARC Cache vorhalten zu können.

Ressourcenverbrauch

Die Deduplizierung ist ein rechenintensiver Prozess. Vor allem beim Schreiben von Daten fallen zusätzliche Berechnungen für die Hash-Generierung und den Vergleich mit der Hashtabelle an. Stellen Sie sich das wie einen zusätzlichen Schritt vor, der bei jedem Speichervorgang durchgeführt werden muss. Zusätzlich benötigt die Hashtabelle selbst Speicherplatz im RAM als Cache. Je mehr Daten dedupliziert werden, desto größer wird die Tabelle und desto mehr RAM wird benötigt.

Auf einem Hypervisor, der bereits die Ressourcen für mehrere virtuelle Maschinen (VMs) bereitstellen muss, kann die Deduplizierung zu einem erheblichen Ressourcenverbrauch führen. Die VMs benötigen Rechenleistung und RAM, um ihre Anwendungen auszuführen. Wenn nun die Deduplizierung ebenfalls Ressourcen beansprucht, kann dies die Leistung der VMs beeinträchtigen.

Auswirkungen auf die VM-Performance

Die Deduplizierung kann die Performance der VMs also spürbar beeinflussen. Durch den erhöhten Rechenaufwand und die zusätzlichen Speicherzugriffe können die Latenzen beim Schreiben von Daten steigen und damit eine längere Zeit in Anspruch nehmen, bis Daten gespeichert sind. Dies kann sich negativ auf die Reaktionszeiten von Anwendungen auswirken, die auf den VMs laufen. Stellen Sie sich beispielsweise eine Datenbank vor, die auf einer VM läuft. Wenn die Deduplizierung die Schreibvorgänge verlangsamt, kann dies zu Verzögerungen bei Datenbankabfragen führen.

Alternative Deduplizierungsmethoden: Storage-Level Deduplizierung

Für Hypervisoren allgemein sind alternative Deduplizierungsmethoden oft besser geeignet. Eine solche Alternative ist die Deduplizierung auf Storage-Ebene. Hierbei übernimmt das Storage-System die Deduplizierung.

Vorteile der Storage-Level Deduplizierung:

  • Entlastung des Hypervisors: Der Hypervisor muss sich nicht um die Deduplizierung kümmern und kann seine Ressourcen für die VMs verwenden.
  • Verbesserte VM-Performance: Die VMs werden nicht durch die Deduplizierung gebremst und können mit voller Leistung arbeiten.
  • Fortschrittlichere Algorithmen: Storage-Systeme verfügen oft über spezialisierte Hardware und Software für die Deduplizierung, die effizienter und leistungsfähiger ist als die Deduplizierung auf Dateisystemebene.
  • Andere Möglichkeoten: Je nach Anbieter und Storage-System lässt sich eine Deduplizierung nicht nur auf Block-Ebene, sondern auch auf Dateiebene oder auf anderer Basis durchführen.

Durch die Auslagerung der Deduplizierung auf das Storage-System wird der Hypervisor entlastet und die Performance der VMs verbessert. Moderne Storage-Systeme bieten zudem oft fortschrittlichere Deduplizierungsalgorithmen, die eine höhere Deduplizierungsrate und eine bessere Performance ermöglichen.

Anderer Ansatz: Komprimierung statt Deduplizierung

Zur effizienteren Nutzung des lokalen Speichers lässt sich unter ZFS auf einem Hypervisor die Komprimierung aktivieren. Dies ist auf Proxmox VE Hypervisoren standardmäßig bereits aktiv, kann aber deaktiviert werden, wenn die Daten nicht komprimiert werden sollen. Hier stehen auch diverse Kompressionsalgorithmen zur Auswahl, vom extrem schnellen lz2 bis zum gut komprimierenden allrounder zstd gibt es eine ausreichende Auswahl.

Auf den Punkt gebracht

Deduplizierung in lokalen Pools ist nicht die optimale Lösung für Hypervisoren. Der Ressourcenverbrauch und die möglichen Auswirkungen auf die VM-Performance sprechen gegen den Einsatz.

Obwohl Deduplizierung in lokalen Pools dazu beitragen kann, Speicherplatz zu sparen, müssen die potenziellen Nachteile in einer Hypervisor-Umgebung berücksichtigt werden. Der zusätzliche Bedarf an RAM und CPU-Leistung kann die Leistung virtueller Maschinen beeinträchtigen.

In den meisten Fällen bietet die Deduplizierung auf Storage-Ebene eine bessere Balance zwischen Speicherplatzersparnis und Performance. Durch die Auslagerung der Deduplizierung auf das Storage-System wird der Hypervisor entlastet und die Leistung der VMs verbessert.

Auch Komprimierung kann für eine effizientere Nutzung des lokalen Speichers sorgen ohne die Nachteile der lokalen Deduplizierung in Kauf nehmen zu müssen.

Relevante Artikel in unserem Blog