Copier des fichiers avec le multithreading rapide parsyncfp | INTROSERV
EUR
european

EUR

usa

USD

French Fr
Ex. VAT Ex. VAT 0%

Copier des fichiers avec le multithreading rapide parsyncfp

Introduction

parsyncfp est une enveloppe parallèle autour de rsync qui accélère le transfert de grandes collections de fichiers en exécutant plusieurs processus rsync simultanément. Chaque processus synchronise son propre lot de fichiers, ce qui permet d'utiliser plus efficacement la bande passante disponible et les ressources CPU qu'avec un seul flux rsync.

Ce guide explique dans quels cas parsyncfp est utile, comment l'installer et comment effectuer un transfert de base entre deux serveurs.

Warning

La copie parallèle accélère les transferts uniquement avec des disques rapides et un réseau stable. Sur des disques lents ou des systèmes de fichiers montés sur le réseau (NFS, SMB, FUSE), augmenter le nombre de processus parallèles n'apporte souvent aucun gain de vitesse et peut au contraire augmenter la charge sur la source, la cible ou la liaison entre les deux. Commencez avec un petit nombre de processus, mesurez le résultat et n'augmentez leur nombre que si les disques et le réseau peuvent suivre.

Fonctionnement de parsyncfp

parsyncfp utilise l'utilitaire fpart pour diviser l'arborescence de fichiers source en lots de taille approximativement égale, puis lance plusieurs processus rsync en parallèle, un par lot. Comme fpart divise l'arborescence progressivement, parsyncfp peut commencer à transférer les fichiers avant que l'analyse complète de l'arborescence source ne soit terminée, ce qui est important pour les arborescences de répertoires très volumineuses.

L'outil doit être installé uniquement sur le serveur source. rsync gère le côté réception comme d'habitude.

Le même auteur maintient un successeur appelé parsyncfp2 (pfp2), qui comprend des corrections de bugs et des améliorations par rapport à parsyncfp et prend également en charge l'envoi depuis plusieurs hôtes source simultanément. Pour les nouvelles installations, parsyncfp2 est recommandé. Ce guide couvre la version classique de parsyncfp ; la syntaxe des commandes pfp2 est largement compatible.

Quand parsyncfp est utile

parsyncfp offre le gain le plus important lorsque :

  • la source contient des millions de petits fichiers, pour lesquels rsync consacre la majeure partie de son temps aux opérations sur les métadonnées plutôt qu'au transfert effectif des données ;
  • la source et la cible utilisent toutes deux un stockage rapide (NVMe, SSD ou RAID correctement configuré) ;
  • le réseau entre la source et la cible est rapide et stable (1 Gbit/s ou plus, avec peu de pertes de paquets) ;
  • un seul processus rsync est limité par le CPU ou par le débit d'un seul flux, et non par le disque ou la liaison réseau.

Pour les petits répertoires, les disques durs lents ou un réseau déjà saturé, rsync classique est généralement suffisant.

Le répertoire ~/.parsyncfp

parsyncfp crée un répertoire de cache appelé ~/.parsyncfp sur le serveur source. À l'intérieur se trouve le sous-répertoire fpcache, qui contient le journal fpart, les fichiers PID des processus rsync en cours d'exécution ainsi que les fichiers de lots indiquant les chemins que chaque processus rsync doit copier. Les fichiers journaux sont horodatés et ne sont pas écrasés entre les exécutions, ce qui permet de consulter les exécutions précédentes ultérieurement.

Si vous souhaitez exécuter plusieurs instances de parsyncfp simultanément, indiquez à chacune un emplacement de cache distinct à l'aide de l'option --altcache. Au démarrage, parsyncfp détecte les autres instances en cours d'exécution et vous avertit de leur présence, ce qui permet de repérer rapidement les exécutions qui se chevauchent accidentellement.

Installation des dépendances

parsyncfp s'appuie sur rsync (pour le transport) et fpart (pour diviser l'arborescence source en lots). Installez les deux sur le serveur source.

Sur Debian et Ubuntu :

apt-get install rsync fpart

Sur RHEL, CentOS Stream, AlmaLinux et Rocky Linux, fpart n'est pas disponible dans les dépôts de base. Activez d'abord le dépôt EPEL, puis installez les deux paquets :

dnf install epel-release dnf install rsync fpart

Certains paquets EPEL dépendent de paquets provenant du dépôt PowerTools ou CRB, qui est désactivé par défaut. Activez celui qui correspond à votre version :

# RHEL/AlmaLinux/Rocky Linux 9 and newer dnf config-manager --set-enabled crb # RHEL/AlmaLinux/Rocky Linux 8 dnf config-manager --set-enabled powertools

Info

Si votre distribution ne fournit pas du tout fpart (par exemple, RHEL 10 ou ses dérivés au moment de la rédaction de ce guide), ou si vous préférez ne pas utiliser EPEL, compilez fpart à partir des sources. Le dépôt officiel est le dépôt GitHub de fpart ; le README indique un petit nombre de dépendances de compilation (un compilateur C, make et les fichiers d'en-tête de la bibliothèque C standard).

Installation de parsyncfp

parsyncfp est un script Perl unique hébergé sur GitHub. Téléchargez-le, rendez-le exécutable et déplacez-le dans un répertoire présent dans votre PATH afin de pouvoir l'appeler sans saisir son chemin complet :

wget https://raw.githubusercontent.com/hjmangalam/parsyncfp/master/parsy ncfp chmod +x parsyncfp sudo mv parsyncfp /usr/local/bin/

Vérifiez que le script fonctionne :

parsyncfp --help

Si l'écran d'aide s'affiche, parsyncfp est prêt à être utilisé.

Configuration de l'accès SSH à la cible

parsyncfp exécute rsync via SSH. Le serveur source doit donc pouvoir se connecter au serveur cible sans mot de passe. Générez une paire de clés sur la source (si elle n'existe pas déjà) et copiez la clé publique sur la cible :

ssh-keygen ssh-copy-id user@target_host

Remplacez user@target_host par le nom d'utilisateur et l'adresse IP ou le nom d'hôte de votre serveur cible. Après cette étape, la commande ci-dessous doit se connecter sans demander de mot de passe :

ssh user@target_host

Effectuer un transfert

Une commande parsyncfp classique ressemble à ceci :

parsyncfp --NP=8 --altcache=/dir/local/tmp --startdir=/dir/local/ www/ [email protected]:/var/dir/

Cette commande démarre 8 processus rsync, utilise /dir/local/tmp comme répertoire de cache et copie le contenu de /dir/local/www vers /var/dir/ sur l'hôte cible 192.168.67.1.

Info

Faites attention à la barre oblique finale dans l'argument source : www/ copie le contenu du répertoire www dans la cible (comme dans l'exemple ci-dessus), tandis que www (sans barre oblique) copie le répertoire www lui-même et crée /var/dir/www/ sur la cible. C'est le même comportement qu'avec rsync classique.

Principaux paramètres de la commande

  • --NP définit le nombre de processus rsync parallèles. Un bon point de départ est de 4 à 8 ; augmentez progressivement ce nombre uniquement si les disques et le réseau ne sont pas encore saturés. Définir --NP sur le nombre de cœurs CPU n'est généralement pas le bon choix à lui seul.
  • --altcache spécifie un autre répertoire de cache. Il est utile lorsque vous exécutez plusieurs instances de parsyncfp simultanément ou lorsque l'emplacement par défaut se trouve sur un stockage lent. Évitez de l'utiliser avec un emplacement basé sur tmpfs (tel que /tmp sur de nombreuses distributions), car les listes de lots pour les arborescences source très volumineuses peuvent devenir importantes et consommer beaucoup de RAM.
  • --startdir définit le répertoire de travail utilisé comme base pour les chemins source indiqués ensuite.
  • Les arguments après --startdir sont les répertoires source à copier (un ou plusieurs, séparés par des espaces), suivis de la cible au format rsync user@host:/path/.

Pour obtenir la liste complète des options, exécutez parsyncfp --help ou consultez la documentation du projet.

Options supplémentaires utiles

Une fois que le transfert de base fonctionne, quelques options méritent d'être connues pour les exécutions en production :

  • --maxbw=500000 limite la bande passante totale utilisée par tous les processus rsync, en Ko/s. Cette option est utile lorsque la liaison est partagée avec d'autres services.
  • --maxload=12 suspend le lancement de nouveaux processus rsync lorsque la charge moyenne du système dépasse la valeur indiquée. Cette option peut être utile sur les serveurs source très sollicités, mais consultez l'avertissement ci-dessous avant de l'utiliser.
  • --chunksize=5G contrôle la taille de chaque lot fpart. Des lots plus grands réduisent la surcharge par lot lors des transferts comportant de nombreux petits fichiers ; des lots plus petits améliorent le parallélisme lors des transferts comportant quelques fichiers très volumineux.
  • --rsyncopts="-a -s -x" permet de transmettre des options supplémentaires directement aux processus rsync sous-jacents. Utilisez cette option pour activer la compression (-z), définir une taille de bloc personnalisée ou appliquer d'autres réglages rsync. Ne transmettez pas --delete via --rsyncopts ; consultez la section « Limitations » ci-dessous pour comprendre pourquoi cette pratique est dangereuse.
  • --verbose=2 augmente le niveau de détail des journaux, ce qui facilite le dépannage lors des premières exécutions.

Warning

L'auteur du projet a documenté un problème connu avec --maxload : lorsque parsyncfp effectue plusieurs cycles de suspension et de reprise, certains fichiers source peuvent ne pas être transférés vers la cible. Si vous utilisez --maxload, définissez un seuil suffisamment élevé pour que les suspensions ne se déclenchent jamais, ou vérifiez le résultat avec un contrôle de cohérence distinct une fois le transfert terminé.

Limitations

Même sur du matériel adapté, parsyncfp présente certains compromis qu'il convient de connaître avant d'augmenter le nombre de processus :

  • parsyncfp ne prend pas en charge de manière sûre l'option --delete de rsync. Chaque processus rsync parallèle ne voit que son propre lot de fichiers source. Si --delete est transmis, chaque processus tentera donc de supprimer sur la cible les fichiers qui ne figurent pas dans son lot, alors que ces fichiers peuvent appartenir à d'autres lots. Cela peut supprimer une grande partie des données de la cible. Utilisez rsync classique (ou une procédure de nettoyage distincte) lorsque vous avez besoin du comportement de --delete.
  • parsyncfp ne préserve pas un ordre global des fichiers entre les processus rsync parallèles. L'ordre dans lequel les fichiers apparaissent sur la cible n'est donc pas prévisible. Cela n'a d'importance que pour les flux de travail qui dépendent des horodatages des fichiers ou de l'ordre d'affichage des répertoires pendant la copie elle-même.
  • Sur les baies de disques HDD, de nombreux processus rsync parallèles transforment un modèle de lecture qui serait normalement séquentiel en un modèle presque aléatoire, ce qui peut être plus lent qu'un seul processus rsync. Les disques SSD et NVMe sont beaucoup moins affectés.
  • Sur les systèmes de fichiers contenant un très grand nombre de petits fichiers, la surcharge liée aux métadonnées de chaque fichier peut dominer le temps de transfert. Le parallélisme apporte des gains jusqu'à un certain point, puis atteint un plateau.
  • Chaque processus rsync ouvre sa propre connexion SSH vers la cible. Des valeurs élevées de --NP multiplient donc la surcharge liée à l'établissement des connexions. Sur les liaisons WAN présentant des pertes de paquets ou une latence élevée, cela peut aggraver la congestion au lieu d'améliorer les performances. Dans ce cas, un nombre plus réduit de processus avec un rsync correctement configuré (compression, taille de bloc plus importante) offre souvent de meilleures performances qu'un grand nombre de processus parallèles.

Voir aussi

Si parsyncfp s'avère plus complexe que nécessaire, le paquet fpart fournit également fpsync, une enveloppe plus simple pour rsync parallèle du même auteur. Elle utilise le même principe de découpage en lots, mais avec moins d'options, et est souvent suffisante pour les transferts ponctuels.

VAT

  • Other

    Ex. VAT

    0%
  • austria

    Austria

    20%
  • Belgium

    Belgium

    21%
  • Bulgaria

    Bulgaria

    20%
  • Croatia

    Croatia

    25%
  • Cyprus

    Cyprus

    19%
  • Czech Republic

    Czech Republic

    21%
  • Denmark

    Denmark

    25%
  • Estonia

    Estonia

    22%
  • France

    France

    20%
  • Finland

    Finland

    24%
  • Germany

    Germany

    19%
  • Greece

    Greece

    24%
  • Hungary

    Hungary

    27%
  • Ireland

    Ireland

    23%
  • Italy

    Italy

    22%
  • Latvia

    Latvia

    21%
  • Lithuania

    Lithuania

    21%
  • Luxembourg

    Luxembourg

    17%
  • Malta

    Malta

    18%
  • Netherlands

    Netherlands

    21%
  • Poland

    Poland

    23%
  • Portugal

    Portugal

    23%
  • Romania

    Romania

    19%
  • Slovakia

    Slovakia

    20%
  • Slovenia

    Slovenia

    22%
  • Spain

    Spain

    21%
  • Sweden

    Sweden

    25%
  • USA

    USA

    0%
european
states
  • germany
  • Español
  • Italiano
  • Poland
  • Русский
  • Slovenski
  • Türkçe
  • ukraine
  • kingdom
  • French
  • Hrvatska
  • Other
  • Austria
  • Belgium
  • Bulgaria
  • Croatia
  • Cyprus
  • Czech Republic
  • Denmark
  • Estonia
  • Finland
  • France
  • Germany
  • Greece
  • Hungary
  • Ireland
  • Italy
  • Latvia
  • Lithuania
  • Luxembourg
  • Malta
  • Netherlands
  • Poland
  • Portugal
  • Romania
  • Slovakia
  • Slovenia
  • Spain
  • Sweden
  • USA