Accelerer une reconstruction ZFS

Soumis par -badmin- le lun 21/11/2016 - 11:25

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 :)