Je souhaite conserver plein de copies de sauvegarde de machines virtuelles tournant sur mon hyperviseur étant un kvm/libvirt/archipel sur une squeeze.
Il y a un candidat idéal pour cela: zfs, qui pour des raisons de licence n’a pas d’implémentation native dans linux.
Pour commencer, j’ai fait quelques tests avec zfs-fuse (0.6.9-1), sans tuning particulier. Ca marche correctement, mais pas très vite (moins de 10 Mo/s).
J’ai ensuite utilisé le zfs natif. Les performances brutes étaient bien meilleures mais ça tirait énormément sur la RAM et tout finissait par devenir très lent, et la sauvegarde d’une des VM ne se terminait jamais. En essayant de tuner la taille du ARC cache, je n’ai réussi qu’à obtenir un plantage complet du noyau (le dmesg parlait de lui même).
Je suis donc retourné à zfs-fuse en attendant de trouver mieux.
Maintenant que j’ai une rotation des VM sur une semaine, je peux avoir une idée précise des ressources requises par la déduplication:
# zpool status -D zpool
pool: zpool
state: ONLINE
scrub: none requested
config:
NAME STATE READ WRITE CKSUM
zpool ONLINE 0 0 0
disk/by-id/dm-name-archipel-zfs ONLINE 0 0 0
errors: No known data errors
DDT entries 282985, size 354 on disk, 222 in core
bucket allocated referenced
__
refcnt blocks LSIZE PSIZE DSIZE blocks LSIZE PSIZE DSIZE
------ ------ ----- ----- ----- ------ ----- ----- -----
1 49,6K 6,20G 2,25G 2,25G 49,6K 6,20G 2,25G 2,25G
2 11,1K 1,39G 583M 583M 27,6K 3,45G 1,42G 1,42G
4 171K 21,4G 12,6G 12,6G 1,13M 145G 85,5G 85,5G
8 43,7K 5,46G 3,11G 3,11G 358K 44,7G 25,4G 25,4G
16 741 92,6M 59,3M 59,3M 13,5K 1,69G 1,04G 1,04G
32 129 16,1M 8,19M 8,19M 4,67K 598M 298M 298M
64 3 384K 67,5K 67,5K 330 41,2M 7,78M 7,78M
128 1 128K 4,50K 4,50K 133 16,6M 598K 598K
1K 1 128K 4,50K 4,50K 1,27K 162M 5,71M 5,71M
2K 1 128K 7K 7K 3,98K 509M 27,8M 27,8M
16K 1 128K 7,50K 7,50K 23,7K 2,96G 178M 178M
Total 276K 34,5G 18,6G 18,6G 1,60M 205G 116G 116G
Je vois ici que j’ai 282985 entrées pour la déduplication, chaque entrée occupant 222 octets en RAM.
J’en déduis donc que mon cache pour la dédup est d’environ 60 Mo (ce qui est peu !).
Par défaut ZFS alloue un quart de la taille du cache ARC pour le cache des metadata, donc fait partie la table DDT.
Le cache ARC doit donc être au moins de 240 Mo.
Par défaut, la valeur sur ma Debian était de 100 Mo.
Cela apparait au démarrage de fuse:
# grep -i zfs /var/log/syslog
Nov 28 21:12:39 archipel zfs-fuse: ARC caching: maximum ARC size: 100 MiB
Nov 28 21:12:39 archipel zfs-fuse: ARC setup: min ARC size set to 16777216 bytes
Nov 28 21:12:39 archipel zfs-fuse: ARC setup: max ARC size set to 104857600 bytes
J’ai donc modifié la ligne « max-arc-size = 240 » dans le fichier /etc/zfs/zfsrc et relancé zfs-fuse
#invoke-rc.d zfs-fuse restart
A titre d’exemple, le temps de sauvegarde de ma VM zimbra est passé de 16 minutes à 6 minutes !
En réglant le cache à 500 Mo, je descends à 3 minutes pour la même sauvegarde. Ce qui correspond à peu près aux temps que j’obtenais avec les modules zfs natifs, mais qui eux provoquaient de nombreux plantages, alors qu’avec zfs-fuse j’ai une solution parfaitement stable. Un réglage du cache à 1 Go n’a pas donné de meilleurs résultats.
Conclusion : Voici la formule appliquée dans mon cas avec zfs-fuse : max-arc-size = Taille du cache DDT * 8