martedì 8 dicembre 2009

ZFS deduplication

Con l'uscita della build 128a di OpenSolaris viene aggiunta una nuova ed importante funzionalità a ZFS: la "deduplication" (evito di tradurre la parola...). Grazie a questa nuova funzionalità il filesystem è in grado di riconoscere eventuali blocchi duplicati e scriverli una volta solo... risparmiando così spazio su disco! I blocchi vengono riconosciuti grazie ad una chiave di hash generata da un algoritmo (selezionabile) e verificata prima di ogni scrittura.
Prima di entrare nel dettaglio mettiamo subito alla prova tale feature; creiamo tre dischi "su file" (da 150 Mega ciascuno) che andranno a comporre il nostro pool:
$ mkfile 150m disk1 disk2 disk3

ora creiamo il nuovo pool, chiamandolo con molta fantasia "dedup":
$ pfexec zpool create dedup \
/export/home/luca/tmp/disk1 \
/export/home/luca/tmp/disk2 \
/export/home/luca/tmp/disk3

controllandone le caratteristiche vediamo subito che la dimensione è pari a 435 Megabyte e notiamo che il rapporto di "deduplication" è pari a uno (visto che ancora non abbiamo scritto nulla):
$ zpool get all dedup
NAME   PROPERTY       VALUE       SOURCE
dedup  size           435M        -
dedup  capacity       0%          -
dedup  altroot        -           default
dedup  health         ONLINE      -
dedup  guid           598651376828683765  default
dedup  version        22          default
dedup  bootfs         -           default
dedup  delegation     on          default
dedup  autoreplace    off         default
dedup  cachefile      -           default
dedup  failmode       wait        default
dedup  listsnapshots  off         default
dedup  autoexpand     off         default
dedup  dedupratio     1.00x       -
dedup  free           435M        -
dedup  allocated      79.5K       -

ora andiamo ad abilitare la "deduplication" a livello di filesystem:
$ pfexec zfs set dedup=on dedup

da questo momento in poi, per ogni nuovo blocco che ZFS andrà a scrivere effettuerà il controllo di duplicazione: copiamo alcuni file nel nuovo filesystem e controlliamo. Per il test ho scelto di copiare alcuni MP3 presenti sul mio disco fisso, vediamo l'occupazione dei file prescelti:
$ du -h /export/home/luca/Documents/Music/aavv_80/
72M    /export/home/luca/Documents/Music/aavv_80/

ora creiamo tre cartelle nel nostro filesystem su cui andremo a copiare i file
$ cd /dedup
$ pfexec mkdir d1
$ pfexec mkdir d2
$ pfexec mkdir d3
$ pfexec mkdir d4

e copiamo i file:
$ pfexec cp /export/home/luca/Documents/Music/aavv_80/* d1
$ pfexec cp /export/home/luca/Documents/Music/aavv_80/* d2
$ pfexec cp /export/home/luca/Documents/Music/aavv_80/* d3
$ pfexec cp /export/home/luca/Documents/Music/aavv_80/* d4

ora controlliamo lo spazio occupato:
$ du -h .
72M    ./d1
72M    ./d2
72M    ./d3
72M    ./d4
287M    .

i conti tornano; su tutte e quattro le cartelle sono presenti 72 Megabyte di MP3... mmmm... e la "deduplication" che fine ha fatto... non ha funzionato?!?!??? Controlliamo meglio:
$ zpool list dedup
NAME    SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
dedup   435M  72.5M   363M    16%  4.00x  ONLINE  -

ecco svelato il mistero!!! Il comando "du" (come anche ls e molti altri) agendo a livello user "vede" la dimensione reale del file (la stessa cosa accade per i filesystem compressi), ma se controlliamo meglio lo spazio allocato a livello di pool vediamo che in realtà sono stati utilizzati "solo" 72.5 Megabyte e il rapporto di "deduplication" è salito a 4; ora i conti tornano alla perfezione!!!

Bene, dopo la pratica torniamo a parlare di teoria, analizzando le varie opzioni legate a questa nuova caratteristica. In precedenza abbiamo semplicemente attivato la deduplication, accettando così le impostazioni di default, tuttavia esistono diverse opzioni settabili per la proprietà dedup:

  • off: dedup disattivata;

  • on: dedup attivata, il blocchi vengono controllati con l'algoritmo SHA256;

  • verify: come sopra l'algoritmo di hash è sempre SHA256, ma in caso di rilevamento di un blocco uguale, viene verificata l'esattezza bit a bit;

  • fletcher4,verify: viene usato l'algoritmo di hash "fletcher4", che risulta essere molto più veloce ma che produce con maggiore probabilità delle duplicazioni di chiavi e quindi è per questo che la verifica è obbligatoria.


Non è detto che in futuro vengano implementati anche altri algoritmi per la verifica delle duplicazioni dei blocchi, il consiglio è quello di attivare la deduplication con l'opzione verify per stare tranquilli :)