ZFS c'est beau, ZFS c'est bien... J'utilise beaucoup ZFS sur des serveurs de stockage longue durée.
Mais ZFS n'est pas encore parfaitement au point sur les systèmes Linux par rapport aux Solaris / BSD.
Du coup ce système de fichiers peut être horriblement lent lors d'une reconstruction de pool de stockage. Pourquoi ?
Tout d'abord, il faut vérifier la longueur de la file d'attente disques lors d'une reconstruction (lancée depuis quelques minutes au moins). Un moyen simple reste iostat.
iostat -dx /dev/disk/by-id/ata-WDC_WD4000FYYZ-01UL1B1_WD-WCC130826296 /dev/disk/by-id/ata-WDC_WD4000FYYZ-01UL1B1_WD-WCC131415738
Linux 3.10.0-327.36.3.el7.x86_64 (storagemaster.badmin.local) 21/11/2016 _x86_64_ (2 CPU)
Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
sdb 0,00 0,00 5,99 121,80 255,85 14271,43 227,37 1,12 8,77 5,34 8,94 7,50 95,84
sdc 0,03 0,00 121,47 8,20 14542,34 75,43 225,45 0,30 2,35 1,74 11,39 1,43 18,56
Ici, on voit que le disque sdb est quasiment occupé à 100%. On ne peut quasiment rien faire à ce niveau. Le nombre de requêtes IO étant déterminé par le nombre de fichiers présents (plus il y a de petits fichies plus il y aura de requêtes IO) et par la fragmentation du pool. Il y a d'ailleurs actuellement des travaux en cours pour optimiser l'algorithme déterminant l'ordre des requêtes (voir https://github.com/zfsonlinux/zfs/issues/4970 ), ce qui aura une incidence sur un disque mécanique, mais aucune sur un SSD étant donné les temps d'accès égaux quelque soit le secteur accédé.
Sinon, et lorsque l'usage disque n'est pas de 100%, c'est que zfs est configuré pour procéder à la reconstruction en arrière plan, avec un impact minimal sur les performances. Il y a alors possibilité de tuner un zfs pour accélerer le processus comme suit:
Supprimer le temps d'attente arbitraire entre deux opérations de reconstruction
echo 0 > /sys/module/zfs/parameters/zfs_resilver_delay
echo 512 > /sys/module/zfs/parameters/zfs_top_maxinflight
Augmenter le temps minimal passé sur la reconstruction par cycle
echo 8000 > /sys/module/zfs/parameters/zfs_resilver_min_time_ms
Et voilà, ça accélère :)