Comment paralleliser rsync avec fpsync

Bonjour,

L’installation ou l’utilisation de Nextcloud nécessite souvent de transférer de grandes quantités de données. Personnellement je suis amené à gérer des données scientifiques et ce sont des centaines de milliers de fichiers et des To de données à balader d’un disque à un autre ou d’un serveur à un autre.

Travaillant sous Linux mon outil favori pour le transfert des données est “rsync” qui est installé par défaut dans la plupart des distributions Linux.

Les utilisateurs de Windows 10 (il y en a…) peuvent aussi désormais l’utiliser puisqu’il est possible d’utiliser bash sous Windows 10. Ils peuvent ainsi disposer d’un outil autre que le copier/coller de Windows… et open source.

Mais même avec rsync, transférer des grandes quantités de données peut s’avérer très loooooong.

Une manière d’accélerer les transferts est donc de paralléliser rsync, c’est à dire de lancer plusieurs processus rsync en même temps.

C’est là qu’intervient fpsync, un outil qui fait partie du logiciel fpart développé par Ganael Laplanche, qu’il soit ici remercié pour les heures de transferts épargnées…

Comment ça marche ?
Avec mes mots à moi je dirai que fpart découpe les données à envoyer en morceaux puis fpsync envoi les morceaux en parrallèle vers la destination.

Comment on l’installe ?
C’est très simple, il faut d’abord installer fpart. Par exemple sous Ubuntu on fait

 sudo apt install fpart

Je vous conseillerais tout de même d’installer le logiciel depuis les sources pour avoir la dernière version avec toutes les fonctionnalités. C’est pas compliqué et tout est expliqué sur la page Github de fpart.

Comment on s’en sert ?
Voilà un exemple simple :

  • La commande rsync “classique” (les options inplace, size-only et vrWO sont utilisées car je synchronise vers un montage s3fs, mais c’est une autre histoire)

    rsync --inplace --size-only -vrWO /source/ /mnt/destination/
    
  • La commande fpsync pour lancer 4 processus rsync simultanés

    fpsync -n 4 -o "--inplace --size-only -vrWO" /source/ /mnt/destination/
    

On peut vérifier que ça envoi du lourd…

grep '/bin/sh -c  /usr/bin/rsync'
root      4216  0.0  0.0   4340   760 ?        S    08:20   0:00 /bin/sh -c  /usr/bin/rsync --inplace --size-only -vrWO  -r --files-from="/tmp/fpsync/parts/1548702468-5506/part.1263" --from0  "/source/  "         "/mnt/destination //"
root      4272  0.0  0.0   4340   728 ?        S    08:20   0:00 /bin/sh -c  /usr/bin/rsync --inplace --size-only -vrWO  -r --files-from="/tmp/fpsync/parts/1548702468-5506/part.1264" --from0  "/source/  "         "/mnt/destination //"
root      7694  0.0  0.0   4340   760 ?        S    08:22   0:00 /bin/sh -c  /usr/bin/rsync --inplace --size-only -vrWO  -r --files-from="/tmp/fpsync/parts/1548702468-5506/part.1265" --from0  "/source/  "         "/mnt/destination //"
root     14019  0.0  0.0   4340   772 ?        S    08:25   0:00 /bin/sh -c  /usr/bin/rsync --inplace --size-only -vrWO  -r --files-from="/tmp/fpsync/parts/1548702468-5506/part.1266" --from0  "/source/  "         "/mnt/destination //"

Bonus
Pour envoyer la commande et faire en sorte qu’elle continue à s’exécuter quand on ferme le terminal :

nohup fpsync -n 4 -o "--inplace --size-only -vrWO" /source/ /mnt/destination/ &

Conclusion
Je n’ai pas tout testé et je n’ai pas encore tout compris dans les options mais c’est clairement un gain de temps énorme pour les transferts avec rsync.

Il y a d’autres outils mais je ne me suis pas encore penché sur la question, si vous avez des retours je suis preneur…

https://github.com/jbd/msrsync --> moins complet mais ne requiert que rsync et python
http://moo.nac.uci.edu/~hjm/parsync/ --> Là c’est pour des très gros volumes avec une énorme bande passante (cluster de calcul)
https://github.com/pftool/pftool --> là encore on est plutôt dans le monde HPC

1 Like