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</pre>
– 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 -