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 un wrapper parallèle autour de rsync qui accélère le transfert de grandes collections de fichiers en exécutant plusieurs processus rsync à la fois. Chaque processus synchronise sa propre portion de fichiers, de sorte que la bande passante et le processeur disponibles sont utilisés plus efficacement qu'avec un seul flux rsync.

Ce guide explique quand parsyncfp est utile, comment l'installer et comment exécuter un transfert de base entre deux serveurs.

Warning

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

Comment fonctionne parsyncfp

parsyncfp utilise l'utilitaire fpart pour diviser l'arborescence des fichiers source en portions de taille à peu près égale, puis lance plusieurs processus rsync en parallèle, un par portion. Comme fpart divise l'arborescence de manière incrémentielle, parsyncfp peut commencer à transférer des fichiers avant que l'analyse complète de l'arborescence source ne soit terminée, ce qui importe pour les très grandes arborescences de répertoires.

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

Le même auteur maintient un successeur nommé parsyncfp2 (pfp2), qui inclut des corrections de bogues et des améliorations par rapport à parsyncfp et prend en outre en charge l'envoi depuis plusieurs hôtes source à la fois. Pour les nouveaux déploiements, parsyncfp2 est le choix recommandé. Ce guide couvre le parsyncfp classique ; la syntaxe des commandes pfp2 est largement compatible.

Quand parsyncfp est utile

parsyncfp apporte le plus grand gain lorsque :

  • la source contient des millions de petits fichiers, pour lesquels rsync passe la plupart de son temps sur des opérations de métadonnées plutôt que sur le transfert réel des données ;
  • la source et la cible sont toutes deux soutenues par un stockage rapide (NVMe, SSD ou un RAID bien configuré) ;
  • le réseau entre la source et la cible est rapide et stable (1 Gbps ou plus, faible perte de paquets) ;
  • un seul processus rsync est limité par le processeur ou par le débit par flux, et non par le disque ou le lien.

Pour les petits répertoires, les disques rotatifs lents ou un réseau saturé, le rsync simple suffit généralement.

Le répertoire ~/.parsyncfp

parsyncfp crée un répertoire de cache nommé ~/.parsyncfp sur le serveur source. À l'intérieur, vous trouverez le sous-répertoire fpcache, qui contient le journal fpart, les fichiers PID des processus rsync en cours et les fichiers de portions qui listent les chemins que chaque rsync doit copier. Les fichiers journaux sont horodatés et ne sont pas écrasés entre les exécutions, de sorte que les exécutions précédentes peuvent être consultées ultérieurement.

Si vous souhaitez exécuter plusieurs instances de parsyncfp en même temps, indiquez à chacune un emplacement de cache distinct avec l'option --altcache. parsyncfp détecte les autres instances en cours au démarrage et avertit à leur sujet, de sorte que les exécutions accidentellement chevauchantes deviennent visibles tôt.

Installation des dépendances

parsyncfp lui-même repose sur rsync (le transport) et fpart (pour diviser l'arborescence source en portions). 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 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 du dépôt PowerTools ou CRB, qui est désactivé par défaut. Activez celui qui convient à votre version :

# RHEL/AlmaLinux/Rocky Linux 9 et plus récents 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 reconstructions au moment de la rédaction), 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 fpart sur GitHub ; le README énumère un petit ensemble de dépendances de compilation (un compilateur C, make et les en-têtes de la bibliothèque C standard).

Installation de parsyncfp

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

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

Vérifiez que le script s'exécute :

parsyncfp --help

Si l'écran d'aide apparaît, parsyncfp est prêt à l'emploi.

Configuration de l'accès SSH à la cible

parsyncfp exécute rsync via SSH, le serveur source doit donc pouvoir se connecter à la 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'IP ou le nom d'hôte de votre serveur cible. Après cette étape, la commande ci-dessous devrait se connecter sans demander de mot de passe :

ssh user@target_host

Exécution d'un transfert

Une commande parsyncfp typique 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 vers la cible (comme dans l'exemple ci-dessus), tandis que www (sans barre oblique) copie le répertoire www lui-même, créant /var/dir/www/ sur la cible. C'est le même comportement que le rsync simple.

Paramètres de commande principaux

  • --NP définit le nombre de processus rsync parallèles. Un point de départ raisonnable est de 4 à 8 ; augmentez le nombre progressivement, et seulement si les disques et le réseau ne sont pas encore saturés. Régler --NP au nombre de cœurs du processeur est rarement le bon choix en soi.
  • --altcache spécifie un répertoire de cache alternatif. Il est utile lorsque vous exécutez plusieurs instances de parsyncfp à la fois ou lorsque l'emplacement par défaut se trouve sur un stockage lent. Évitez de le pointer vers un emplacement basé sur tmpfs (comme /tmp dans de nombreuses distributions), car les listes de portions pour de très grandes arborescences source peuvent devenir volumineuses et vous ne voulez pas qu'elles consomment la RAM.
  • --startdir définit le répertoire de travail utilisé comme base pour les chemins source qui le suivent.

Les arguments après --startdir sont les répertoires source à copier (un ou plusieurs, séparés par des espaces), suivis de la cible de style rsync sous la forme user@host:/path/.

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

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. Utile lorsque le lien est partagé avec d'autres services.
  • --maxload=12 suspend le lancement de nouveaux processus rsync dès que la charge moyenne du système dépasse la valeur donnée. Utile sur des serveurs source chargés, mais lisez l'avertissement ci-dessous avant de l'utiliser.
  • --chunksize=5G contrôle la taille de chaque portion fpart. Des portions plus grandes réduisent la surcharge par portion sur les transferts comportant de nombreux petits fichiers ; des portions plus petites améliorent le parallélisme sur les transferts comportant quelques très grands fichiers.
  • --rsyncopts="-a -s -x" permet de transmettre des indicateurs supplémentaires directement aux processus rsync sous-jacents. Utilisez-le pour activer la compression (-z), définir une taille de bloc personnalisée ou appliquer d'autres réglages de rsync. Ne transmettez pas --delete via --rsyncopts ; voir la section « Limitations » ci-dessous pour comprendre pourquoi cela est dangereux.
  • --verbose=2 augmente le niveau de détail de la journalisation, ce qui facilite le dépannage lors des premières exécutions.

Warning

L'auteur upstream a documenté un problème connu avec --maxload : lorsque parsyncfp passe par des cycles répétés de suspension et de reprise, certains fichiers source peuvent ne pas être transférés vers la cible. Si vous utilisez --maxload, réglez le seuil suffisamment haut pour que les suspensions ne se déclenchent jamais, ou vérifiez le résultat avec un contrôle de cohérence séparé après la fin du transfert.

Limitations

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

  • parsyncfp ne prend pas en charge en toute sécurité l'option --delete de rsync. Chaque processus rsync parallèle ne voit que sa propre portion de la source, donc si --delete est transmis, chaque processus tentera de supprimer sur la cible les fichiers qui ne sont pas dans sa portion, c'est-à-dire les fichiers qui appartiennent légitimement à d'autres portions. Cela peut effacer de grandes parties de la cible. Utilisez le rsync simple (ou une passe de nettoyage séparée) lorsque vous avez besoin de la sémantique de --delete.
  • parsyncfp ne préserve pas un ordre global des fichiers entre les processus rsync parallèles, de sorte que l'ordre dans lequel les fichiers apparaissent sur la cible n'est pas prévisible. Cela n'importe que pour les flux de travail qui dépendent des horodatages des fichiers ou de l'ordre de listage des répertoires pendant la copie elle-même.
  • Sur les baies HDD, de nombreux processus rsync parallèles transforment ce qui serait un schéma de lecture séquentiel en un schéma quasi aléatoire, ce qui peut être plus lent qu'un seul rsync. Les disques SSD et NVMe sont beaucoup moins affectés.
  • Sur les systèmes de fichiers comportant un très grand nombre de petits fichiers, la surcharge de métadonnées par fichier peut dominer le temps de transfert. Le parallélisme aide jusqu'à un certain point, puis plafonne.
  • Chaque processus rsync ouvre sa propre connexion SSH vers la cible, de sorte que des valeurs élevées de --NP multiplient la surcharge d'établissement de connexion. Sur des liens WAN avec perte de paquets ou latence élevée, cela peut aggraver la congestion plutôt que de l'améliorer. Dans ce cas, moins de processus avec un rsync optimisé (compression, taille de bloc plus grande) offre souvent de meilleures performances que de nombreux processus parallèles.

Voir aussi

Si parsyncfp s'avère plus lourd que ce dont vous avez besoin, le paquet fpart inclut également fpsync, un wrapper parallèle de rsync plus simple du même auteur. Il utilise la même idée de découpage en portions mais avec moins d'options et suffit souvent pour des 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