L’objectif de cet article est de démontrer le bon fonctionnement de la compression/déduplication dans le port du système de fichier ZFS sous Linux Centos 6 (une VM hyper-V dans mon cas).
Tour à tour, je vais créer un volume ZFS sur lequel je vais activer ou pas la compression/ déduplication. Je vais ensuite créer au sein de ce système de fichier, un fichier de 50Mo et nous verrons comment évolue l’espace disque utilisé par ZFS.
Un système de fichier ZFS vide
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=off zfs-pool/zfs-volume
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
On constate que le dossier /zfs-pool/zfs-volume est vide! Le volume ZFS utilise 111K.
Un système de fichier ZFS avec un fichier de 50 Mo « vide »
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=off zfs-pool/zfs-volume
dd if=/dev/zero of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Sans surprise, le volume ZFS consommé 50Mo de disque.
Un système de fichier ZFS « compressé » avec un fichier de 50 Mo « vide »
J’active cette fois l’option de compression du volume ZFS
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=on zfs-pool/zfs-volume
zfs set dedup=off zfs-pool/zfs-volume
dd if=/dev/zero of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Le volume ZFS occupe seulement 110K alors qu’il contient un fichier de 50Mo. Comme ce fichier est plein de vide, il se compresse très bien.
Un système de fichier ZFS « dédupliqué » avec un fichier de 50 Mo « vide »
J’active cette fois l’option de déduplication du volume ZFS
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=on zfs-pool/zfs-volume
dd if=/dev/zero of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Le volume ZFS occupe seulement 269K alors qu’il contient un fichier de 50Mo. Comme le fichier est plein de vide – donc de bloc identiques, il se déduplique très bien.
Un système de fichier ZFS « compressé & dédupliqué » avec un fichier de 50 Mo « vide »
J’active cette fois l’option de déduplication et de compression du volume ZFS
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=on zfs-pool/zfs-volume
zfs set dedup=on zfs-pool/zfs-volume
dd if=/dev/zero of=/zfs-pool/zfs-volume/sample bs=1M count=50
sync
sync
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Le volume ZFS occupe seulement 110K alors qu’il contient un fichier de 50Mo. Comme ce fichier est plein de vide, il se compresse très bien. Après compression, il ne reste plus grand-chose à dédupliquer.
Un système de fichier ZFS avec un fichier de 50 Mo dont le contenu est aléatoire
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=off zfs-pool/zfs-volume
dd if=/dev/urandom of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Sans surprise! Sans compression; sans déduplication, sur un fichier au contenu complètement aléatoire, ZFS occupe réellement 50Mo.
Un système de fichier ZFS « compressé» avec un fichier de 50 Mo dont le contenu est aléatoire
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=on zfs-pool/zfs-volume
zfs set dedup=off zfs-pool/zfs-volume
dd if=/dev/urandom of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Rien à faire. Le contenu du fichier est totalement aléatoire; aucune chance de compression. ZFS occupe 50Mo.
Un système de fichier ZFS « dédupliqué» avec un fichier de 50 Mo dont le contenu est aléatoire
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=on zfs-pool/zfs-volume
dd if=/dev/urandom of=/zfs-pool/zfs-volume/sample bs=1M count=50
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Rien à faire. Le contenu du fichier est totalement aléatoire; aucune chance de déduplication. ZFS occupe 50Mo.
Un système de fichier ZFS « dédupliqué» avec deux copies d’un même fichier de 50 Mo dont le contenu est aléatoire
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=off zfs-pool/zfs-volume
zfs set dedup=on zfs-pool/zfs-volume
dd if=/dev/urandom of=/zfs-pool/zfs-volume/sample bs=1M count=50
cp /zfs-pool/zfs-volume/sample /zfs-pool/zfs-volume/sample2
clear
ls -la /zfs-pool/zfs-volume
zdb -s zfs-pool
Le système de fichier occupe bien 100Mo mais comme les deux fichiers sont identiques, seuls les 50Mo du premier fichier sont consommés.
Un système de fichier ZFS « compressé & dédupliqué » avec une copie de « /usr »
Pour cet exemple, afin de prendre un vrai jeu de données,je copie le contenu de « /usr » vers la volume ZFS.
clear
zpool destroy -f zfs-pool
zpool create zfs-pool mirror -f /dev/sda /dev/sdb
zfs create zfs-pool/zfs-volume
zfs set compress=on zfs-pool/zfs-volume
zfs set dedup=on zfs-pool/zfs-volume
cp -r /usr/ /zfs-pool/zfs-volume
clear
zfs get compressratio zfs-pool/zfs-volume
zpool list
Oui, la compression et la déduplication fonctionnent bien!