Copie de pools ZFS, augmenter les performances

Submitted by-badmin- onjeu 05/04/2018 - 11:52

Dans le dernier article sur la copie de pools zfs, nous avions évoqué l'utilisation de netcat pour gérer le transfert par le réseau des données générées et reçues par zfs.

Dans les faits, zfs send / receive est quelque fois occupé à lire / vérifier des informations, et ne sera donc pas en mesure d'alimenter correctement le flux de données. Pour cela, nous allons remplacer netcat par un cousin amélioré qui gère un peu de mémoire cache, j'ai nommé mbuffer.

Sur une distribution BSD, il faudra par exemple installer le paquet mbuffer et sa dépendance mhash. Utilisant un TrueNAS, j'ai directement téléchargé ces paquets sur pkg.freebsd.org, et installé avec pkg add plutôt que pkg install.

Une fois prêt, il suffira alors de remplacer nc par mbuffer comme suit

Sur la machine réception:

mbuffer -s 128k -m 1G -4 -I 5005 | zfs receive -F -s pool/dataset

Il s'agira de créer un buffer de 1Go par blocs de 128k. Le paramètre -F indique qu'il faut écraser le dataset existant.y

Le paramètre -s (s'il est supporté par votre version de ZFS) permet d'enregistrer un token en cas d'interruption d'envoi, très pratique pour reprendre là ou s'était arrété l'envoi sur un lien non stable avec via zfs send -t [token].

Notez que j'ai du ajouter le paramètre -4 pour forcer mbuffer à écouter sur une IPv4, car par défaut il n'écoutait qu'en IPv6.

Sur la machine d'envoi:

zfs send -R pool/dataset@snapshotenvoi | mbuffer -s 128k -m 1G -O 10.13.37.0:5005

 

En remplaçant nc par mbuffer, je suis passé de 2Gbits/s à 3,5Gbits/s en moyenne sur mes transferts.

Ce résultat s'expliquera surtout par le fait que les disques du TrueNas d'envoi étaient par moment occupés en IO, et coupaient donc l'envoi, phénomène qui a pu être enrayé par l'utilisation du cache lecture / ecriture permettant de "lisser" la vitesse d'envoi.