ZFS Deduplication - Verständnisproblem

Rosendoktor

Well-Known Member
Hi,

ich hab hier auf einem FreeBSD Server ein paar Minecraft Server laufen für die Kids zum zocken. Die laufen in jeweils einem eigenen Jail, jedes Jail enthält eine vollständige FreeBSD Installation. Die Jails unterscheiden sich also nur in ein paar Konfigurationsdateien und den Spielstandsdaten.

Da dachte ich mir, ist doch geradezu prädestiniert dafür, mal ZFS Deduplication auszuprobieren.

Also flugs ein Dataset erstellt mit dedup=on, die ganzen Jails da reinkopiert, und alles eingehängt.

Soweit gut. Jetzt verwirrt mich aber zum einen dieser Satz aus der ORACLE Dokumentation:
Although deduplication is set as a file system property, the scope is pool-wide.
Zum anderen, dass man die dedupratio nur poolweit abfragen kann:
Code:
root@polaris:~# zpool get all polaris_zroot | grep dedup
polaris_zroot  dedupditto                     0                              default
polaris_zroot  dedupratio                     6.40x                          -
Was heisst das jetzt?

  • Bedeutet es, dass Deduplication für den ganzen Pool aktiviert wird, sobald man es für einen Dataset aktiviert? Dann ergibt es keinen Sinn, dass die Eigenschaft den Datasets zugeordnet ist.
  • Oder ist nur die Anzeige der dedupratio poolweit, die Deduplication selbst aber auf die Datasets bezogen? Irgendwie auch komisch.
  • Oder heisst es, dass nur Daten, die in die Datasets mit dedup=on geschrieben werden, Deduplication angewendet wird, aber bezogen auf die Daten des ganzen Pools? Das ist aber jetzt geraten...

:confused:

Grüße,

Robert
 
Die Jails unterscheiden sich also nur in ein paar Konfigurationsdateien und den Spielstandsdaten.

Da dachte ich mir, ist doch geradezu prädestiniert dafür, mal ZFS Deduplication auszuprobieren.
Das ist eher dafür prädestiniert Thin-Jails zu verwenden. :-)
Deduplizierung kostet außerdem viel RAM, da er ja intern Buch darüber führen muss welcher Block welchen Inhalt hat.
Man rechnet so grob übern Daumen gepeilt mit 5GB RAM pro 1TB Festplattenplatz.

Bedeutet es, dass Deduplication für den ganzen Pool aktiviert wird, sobald man es für einen Dataset aktiviert?
Deduplizierung gilt nur für das Dataset für das Du es aktiviert hast.
 
Das ist eher dafür prädestiniert Thin-Jails zu verwenden. :-)
Pff, Triviallösung... :D Klar, schon richtig, aber k.A. wie das am besten geht und was dann alles rein muss.

Deduplizierung kostet außerdem viel RAM, da er ja intern Buch darüber führen muss welcher Block welchen Inhalt hat.
Man rechnet so grob übern Daumen gepeilt mit 5GB RAM pro 1TB Festplattenplatz.
Es sind etwa 100GB Plattenplatz, nach der Rechnung also etwa 500MB RAM Bedarf, das geht bei 16GB RAM im System.

Deduplizierung gilt nur für das Dataset für das Du es aktiviert hast.
Ja und nein, nach dem was ich sonst noch herausgefunden habe. Dedupliziert wird nur in dem Dataset, für den die Deduplizierung aktiviert ist, aber der Abgleich der Hashes inkludiert alle Daten des gesamten Pools. So fügen sich die Infos jedenfalls zusammen.

So sollten meine Jails also als Duplikate des auf dem gleichen Pool in einem anderen Dataset liegenden ROOT Systems eigentlich gar keinen extra Speicherplatz für die Systemdaten beanspruchen.

Allerdings kommte es dabei wohl auch auf andere Eigenschaften der Datasets an, da die Reihenfolge der Verarbeitung Kompression -> Verschlüsselung -> Deduplizierung ist. Sind Kompression und Verschlüsselung der Datasets unterschiedlich, ist's nix mit Dataset übergreifender Deduplizierung.

Egal, ich lass es jetzt so. Läuft prima, weder RAM Auslastung noch Performance sind irgendwie kritisch.
 
Was sich eher anbieten würde, ist die Jails als Clones von einem Snapshot zu erstellen. Dann ist der Hauptteil nur einmal auf der Platte und ab da wachsen die Datasets individuell.
 
Klar, schon richtig, aber k.A. wie das am besten geht und was dann alles rein muss.
Ist eigentlich gar nicht so schwer.
Man legt sich einfach eine Basis-Jail an. Beispielsweise gemäß
bsdinstall jail /jails/base-jail

Wenn man daraus eine "Thin-Jail" erstellen will. Zum Beispiel Für einen Webserver legt man ein weiteres Verzeichnis (oder ZFS dataset) z.B. mit dem Namen
/jails/webserver
an. Dann übernimmt man erst mal die Verzeichnisstruktur der Base-Jail:
find /jails/base-jail -type d | cpio -pdvm /jails/webserver

Dann kopiert man alle "beweglichen" Teile eines FreeBSD-Systems.
Wie etc, var und von mir aus noch root.

Dann macht man sich eine passende fstab für seine Jail, um alles Notwendiger aus der Basis-Jail via NullFS zu mounten:
Code:
/jails/base-jail/usr/tests       /jails/webserver/usr/tests      nullfs ro 0 0
/jails/base-jail/usr/src         /jails/webserver/usr/src        nullfs ro 0 0
/jails/base-jail/usr/share       /jails/webserver/usr/share      nullfs ro 0 0
/jails/base-jail/usr/sbin        /jails/webserver/usr/sbin       nullfs ro 0 0
/jails/base-jail/usr/obj         /jails/webserver/usr/obj        nullfs ro 0 0
/jails/base-jail/usr/libexec     /jails/webserver/usr/libexec    nullfs ro 0 0
/jails/base-jail/usr/libdata     /jails/webserver/usr/libdata    nullfs ro 0 0
/jails/base-jail/usr/lib32       /jails/webserver/usr/lib32      nullfs ro 0 0
/jails/base-jail/usr/lib         /jails/webserver/usr/lib        nullfs ro 0 0
/jails/base-jail/usr/include     /jails/webserver/usr/include    nullfs ro 0 0
/jails/base-jail/usr/bin         /jails/webserver/usr/bin        nullfs ro 0 0
/jails/base-jail/sbin            /jails/webserver/sbin           nullfs ro 0 0
/jails/base-jail/rescue          /jails/webserver/rescue         nullfs ro 0 0
/jails/base-jail/libexec         /jails/webserver/libexec        nullfs ro 0 0
/jails/base-jail/lib             /jails/webserver/lib            nullfs ro 0 0
/jails/base-jail/boot            /jails/webserver/boot           nullfs ro 0 0
/jails/base-jail/bin             /jails/webserver/bin            nullfs ro 0 0

Und der Rest dann eigentlich wie bei der Jail-Einrichtung üblich. Also klar. zusätzlich in der /etc/jail.conf via Option mount.fstab obige fstab-Datei einbinden.

Alternativ kann man natürlich das auch mit ZFS-Snapshots/Clones machen.

Ja und nein, nach dem was ich sonst noch herausgefunden habe. Dedupliziert wird nur in dem Dataset, für den die Deduplizierung aktiviert ist, aber der Abgleich der Hashes inkludiert alle Daten des gesamten Pools. So fügen sich die Infos jedenfalls zusammen.
Also ich hab es so verstanden, das es entweder Pool-weit eingeschaltet werden kann oder halt pro Dataset.
 
Zurück
Oben