Freebsd – Howto ZFS + Deduplication + Compression

Installation de ZFS et tests des fameuses fonctionnalités de déduplication et de compression.

Voici un test sur un axe en raid 5 séparé de la partie système d’un serveur HP DL380 G2,. L’OS fraîchement installé est un Freebsd 8.2-RELEASE.

“dmesg” informe de l’existence des volumes da0 et da1. da0 est le système. Nous nous attarderons sur da1 qui n’est pas utilisé.

tripaxcolt2# dmesg | egrep "^da"
da0 at ciss1 bus 0 scbus1 target 0 lun 0
da0: <COMPAQ RAID 1(1VOLUME OK> Fixed Direct Access SCSI-0 device
da0: 135.168MB/s transfers
da0: Command Queueing enabled
da0: 34727MB (71122560 512 byte sectors: 255H 32S/T 8716C)
da1 at ciss1 bus 0 scbus1 target 1 lun 0
da1: <COMPAQ RAID 5 VOLUME OK> Fixed Direct Access SCSI-0 device
da1: 135.168MB/s transfers
da1: Command Queueing enabled
da1: 104183MB (213367680 512 byte sectors: 255H 32S/T 26148C)

– Création d’une slice Freebsd de 102Gb.

tripaxcolt2#  gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613       - free -  (102G)

tripaxcolt2# gpart add -t freebsd da1
da1s1 added
tripaxcolt2# gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613    1  freebsd  (102G)

tripaxcolt2# gpart create -s BSD da1s1
da1s1 created

tripaxcolt2#  gpart show da1
         34  213367613  da1  GPT  (102G)
         34  213367613    1  freebsd  (102G)

– Chargement des kernel modules nécessaires à ZFS:

tripaxcolt2# kldload opensolaris
tripaxcolt2# kldload zfs
tripaxcolt2#

– Création du pool “data”:

tripaxcolt2# zpool create data /dev/da1s1
tripaxcolt2#

– On peut voir que le montage est effectué instantanément:

tripaxcolt2# mount
/dev/da0s1a on / (ufs, local)
devfs on /dev (devfs, local, multilabel)
/dev/da0s1e on /tmp (ufs, local, soft-updates)
/dev/da0s1f on /usr (ufs, local, soft-updates)
/dev/da0s1d on /var (ufs, local, soft-updates)
data on /data (zfs, local)

tripaxcolt2# df -h /data
data 99G 21K 99G 0% /data

zpool status nous informera du status de notre pool nouvellement créé:


tripaxcolt2# zpool status data
 pool: data
 state: ONLINE
 scrub: none requested
 config:

NAME STATE READ WRITE CKSUM
 data ONLINE 0 0 0z
 da1s1 ONLINE 0 0 0

errors: No known data errors

– zpool list nous donne la liste des pools (ici, un seul).


tripaxcolt2# zpool list
 NAME SIZE USED AVAIL CAP HEALTH ALTROOT
 data 101G 75K 101G 0% ONLINE -

– Il faut que le montage se fasse automatiquement au boot. Pour cela, il faut définir le mountpoint à ZFS.

tripaxcolt2# echo 'zfs_enable="YES"' >> /etc/rc.conf
tripaxcolt2# echo 'zfs_load="YES"' >> /boot/loader.conf
tripaxcolt2# umount /data
tripaxcolt2# zfs set mountpoint=/data data
tripaxcolt2# zpool export data

 tripaxcolt2# zpool import data
 tripaxcolt2# zfs mount -a
 tripaxcolt2# df -h
 Filesystem Size Used Avail Capacity Mounted on
 /dev/da0s1a 989M 172M 738M 19% /
 devfs 1.0K 1.0K 0B 100% /dev
 /dev/da0s1e 989M 12K 910M 0% /tmp
 /dev/da0s1f 20G 151M 18G 1% /usr
 /dev/da0s1d 7.2G 304K 6.7G 0% /var
 data 99G 21K 99G 0% /data

– Vérifions si nous avons la déduplication active:


tripaxcolt2# zpool get all data
 NAME PROPERTY VALUE SOURCE
 data size 101G -
 data used 85.5K -
 data available 101G -
 data capacity 0% -
 data altroot - default
 data health ONLINE -
 data guid 2284095815770433086 default
 data version 15 default <------------- v15
 data bootfs - default
 data delegation on default
 data autoreplace off default
 data cachefile - default
 data failmode wait default
 data listsnapshots off default
 

On voit que nous sommes en ZFS version 15, une version n’offrant pas de déduplication ni de compression.

En effet, il faut être en v28, et cette version a été margée que sous FreeBSD 8.2-STABLE et Freebsd 9-BETA.

Or ici, c’est une Freebsd 8.2-RELEASE. C’est parti pour une upgrade kernel/userland


upgrade kernel -> 8.2-STABLE (cf /usr/src/Makefile)

– Après le reboot final, nous sommes  à jour:


# tripaxcolt2# uname -a
FreeBSD tripaxcolt2 8.2-STABLE FreeBSD 8.2-STABLE #0: Tue Aug 23 13:40:45 CEST 2011     root@tripaxcolt2:/usr/obj/usr/src/sys/GENERIC  i386&lt;/pre&gt;

– Updatons le pool zfs


tripaxcolt2# zpool upgrade
 This system is currently running ZFS pool version 28.

The following pools are out of date, and can be upgraded. After being
 upgraded, these pools will no longer be accessible by older software versions.

VER POOL
 --- ------------
 15 data

Use 'zpool upgrade -v' for a list of available versions and their associated
 features.

tripaxcolt2# zpool upgrade data
 This system is currently running ZFS pool version 28.
 Successfully upgraded 'data' from version 15 to version 28

tripaxcolt2# zfs upgrade data
 1 filesystems upgraded

– Ces 2 commands (zpool upgrade & zfs upgrade) sont suffisantes pour passer de la v15 à v28.

Petite vérification :


tripaxcolt2# zpool get all data
 NAME PROPERTY VALUE SOURCE
 data size 101G -
 data capacity 0% -
 data altroot - default
 data health ONLINE -
 data guid 2284095815770433086 default
 data version 28 default <---------- v28
 data bootfs - default
 data delegation on default
 data autoreplace off default
 data cachefile - default
 data failmode wait default
 data listsnapshots off default
 data autoexpand off default
 data dedupditto 0 default
 data dedupratio 1.00x -
 data free 101G -
 data allocated 83.5K -
 data readonly off -

– Maintenant passons aux tests avec dd (avec /dev/zero) :


tripaxcolt2# dd if=/dev/zero of=/data/test1 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 90.750924 secs (11554439 bytes/sec)

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 1G 98G 1% /data

tripaxcolt2# dd if=/dev/zero of=/data/test2 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 87.764387 secs (11947625 bytes/sec)

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 2G 97G 2% /data

–> on voit que la compression n’est pas active, et oui il faut l’activer manuellement, idem pour la déduplication.

– Activation de la déduplication et de la compression:


tripaxcolt2# zfs set dedup=on data
tripaxcolt2# zfs set compression=on data
tripaxcolt2#

– Refaisons le même test avec dd (toujours avec /dev/zero) pour tester la compression:


tripaxcolt2# rm test*
tripaxcolt2# ls -la
total 4
drwxr-xr-x 2 root wheel 2 Aug 23 17:54 .
drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..

tripaxcolt2# dd if=/dev/zero of=test1 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 11.337030 secs (92491244 bytes/sec)
 tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 31k 99G 0% /data

tripaxcolt2# ls -la
 total 4
 drwxr-xr-x 2 root wheel 3 Aug 23 17:54 .
 drwxr-xr-x 21 root wheel 512 Aug 23 17:28 ..
 -rw-r--r-- 1 root wheel 1048576000 Aug 23 17:54 test1
 tripaxcolt2# du -sh test1
 512B test1

tripaxcolt2# dd if=/dev/zero of=test2 count=100 bs=10M
 100+0 records in
 100+0 records out
 1048576000 bytes transferred in 11.778770 secs (89022538 bytes/sec)
 tripaxcolt2#

tripaxcolt2# df -h /data
 Filesystem Size Used Avail Capacity Mounted on
 data 99G 31k 99G 0% /data
 tripaxcolt2#

tripaxcolt2# du -sh test*
 512B test1
 512B test2
 tripaxcolt2# du -sh /data/
 2.5k /data/

–> on a donc 2 fichiers de 1Go chacun et pourtant cela prend que 2.5Ko.

La compression est un succès !

– Passons à la déduplication.

Nous allons utiliser dd avec /dev/random pour ne pas exploiter la compression mais uniquement la déduplication.


tripaxcolt2# dd if=/dev/random of=test2 count=100 bs=10M
100+0 records in
100+0 records out
1048576000 bytes transferred in 122.076469 secs (8589501 bytes/sec)
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 99G 1G 98G 1% /data

tripaxcolt2# du -sh *
 512B test1
 1G test2

– Nous avons un fichier “test2” de 1Go. Pour tester la déduplication, il suffit de copier ce fichier vers un nouveau (avec “cp”):


tripaxcolt2# cp test2 test3 <--- 1ere copie
tripaxcolt2# du -sh *
512B test1
1G test2 <--- original
1G test3 <--- 1ere copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 100G 2G 98G 2% /data <---- Passage de 99G à 100G
tripaxcolt2# cp test3 test4 <---- 2eme copie
tripaxcolt2# du -sh *
512B test1
1G test2 <--- original
1G test3 <--- 1ere copie
1G test4 <--- 2eme copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 101G 3G 98G 3% /data <---- Passage de 100G à 101G

tripaxcolt2# cp test4 test5 <---- 3eme copie
tripaxcolt2# du -sh *
 512B test1
 1G test2 <--- original
 1G test3 <--- 1ere copie
 1G test4 <--- 2eme copie
 1G test5 <--- 3eme copie
tripaxcolt2# df -h /data
Filesystem Size Used Avail Capacity Mounted on
data 102G 3.9G 98G 4% /data <---- Passage de 101G à 102G

=> On voit que la taille du disque total a augmenté, passant de 99Go à 102Go après les 3 copies du fichier de 1Go. Succès !

– Quelques statistiques:


tripaxcolt2# zdb -DD data
 DDT-sha256-zap-duplicate: 8000 entries, size 268 on disk, 142 in core

DDT histogram (aggregated over all DDTs):

bucket allocated referenced
 ______ ______________________________ ______________________________
 refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
 ------ ------ ----- ----- ----- ------ ----- ----- -----
 4 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G
 Total 7.81K 1000M 1000M 1000M 31.2K 3.91G 3.91G 3.91G

dedup = 4.00, compress = 1.00, copies = 1.00, dedup * compress / copies = 4.00

tripaxcolt2# zpool list
NAME   SIZE  ALLOC   FREE    CAP  DEDUP  HEALTH  ALTROOT
data   101G  1006M   100G     0%  4.00x  ONLINE  -

Leave a Reply

Your email address will not be published. Required fields are marked *


− 4 = zero