Accélérez / évitez le calcul des listes de fichiers rsync

12

J'utilise rsync 3.1.1 pour synchroniser deux disques, dont l'un est sur le réseau et monté en tant que partage samba /mnt/ROUTER_WD_2TB/. Il s'agit de la source, avec une vitesse maximale de 30 à 40 Mo / s en raison des limitations du réseau. L'autre, la destination, est monté localement (crête 110 Mo / s) et l'est /mnt/BACKUP_HITACHI_2TB/.

J'utilise la commande rsync suivante:

rsync  -haAXi --quiet --append-verify --delete /mnt/ROUTER_WD_2TB/* /mnt/BACKUP_HITACHI_2TB/.

Les disques contiennent de nombreux fichiers, pour la plupart petits.

Le problème est que rsync prend assez de temps (10-20m) avant de commencer à déplacer des fichiers, je suppose parce qu'il doit calculer des listes de fichiers pour un très grand nombre de petits fichiers. Pendant cette période, l'utilisation de newtwork se situe à un faible 200-500KB / s, tandis que lors du transfert de fichiers, la vitesse est d'environ 40MB / s.

Il arrive généralement que rsync prenne environ 15 minutes pour finalement trouver quelque chose qu'il doit copier, puis 5 secondes pour le copier, puis continue de rechercher d'autres fichiers à copier pendant encore 5 minutes. Dans l'ensemble, une copie de fichier de 5 secondes finit par durer 20 minutes!

Existe-t-il une mesure que je pourrais prendre pour éviter cette longue période avant de copier les fichiers, à l'exception de l'exclusion des dossiers? Tout type de "cache" que je peux implémenter pour que rsync n'ait pas à reconstruire toute la liste des fichiers à partir de zéro?

AF7
la source
1
Avez-vous essayé une solution à partir de ce fil? unix.stackexchange.com/questions/189878/…
UVV
@UVV Je ne l'ai pas fait. je peux le faire, cependant 1) rsync ne semble pas déjà utiliser un noyau complet dans mon cas, pour une raison quelconque (= je ne sais pas si je suis limité par le processeur ou si la limitation se situe ailleurs) et 2) Ce n'est que sur un processeur dual-core, donc même si l'amélioration était de 2X, il y aurait encore une grande marge d'amélioration.
AF7
Oui, cela me semble fou, pourquoi rsync est-il si lent? Même avec "--size-only" rsync semble prendre une éternité pour construire sa liste de fichiers incrémentielle. Pourquoi? Je peux vérifier manuellement les tailles de fichiers et déterminer celles qui ont changé beaucoup plus rapidement! Qu'est-ce que cela fait perdre autant de temps à faire, et comment désactiver ces fonctionnalités sophistiquées? EDIT: Ah, peu importe, j'ai eu le drapeau «c» par accident. Sans les sommes de contrôle, c'est très rapide.
Ben Farmer

Réponses:

5

En ce rsyncqui vous concerne, vous copiez entre deux arborescences de fichiers locales, donc il désactive la plupart de ses optimisations (y compris son algorithme delta pour lequel il est célèbre). Si vous pouvez exécuter un rsyncsur votre serveur distant (afin d'obtenir un véritable scénario client-serveur sur votre réseau), vous gagnerez beaucoup de traction.

Néanmoins, voici d'autres options à considérer

  1. Copier sans se soucier de supprimer les anciens fichiers. Cela peut vous permettre d'effectuer un transfert plus rapide plus souvent et de reléguer le nettoyage plus lent à dire, une seule fois par jour:

    cp -au /mnt/ROUTER_WD_2TB/. /mnt/BACKUP_HITACHI_2TB/
    
  2. Utilisez une variante de rsyncl'algorithme de suppression par défaut de pour éviter de créer une liste complète de fichiers avant le transfert:

    rsync -haAXi --quiet --delete --delete-during /mnt/ROUTER_WD_2TB/ /mnt/BACKUP_HITACHI_2TB/
    
  3. Divisez les répertoires de niveau supérieur en tâches distinctes et exécutez-les en parallèle. Vous constaterez peut-être que si vous êtes lié au disque, cela n'aidera pas vraiment, et pour les plateaux en rotation, cela aggravera certainement les choses.

    for d in /mnt/ROUTER_WD_2TB/*
    do
        rsync -haAXi --quiet --delete --delete-during "$d" /mnt/BACKUP_HITACHI_2TB/ >"/tmp/rsync.${d/*\/}.log" 2>&1 &
    done
    wait
    cat /tmp/rsync.*.log
    rm -f /tmp/rsync.*.log
    

Si aucune de ces suggestions aide il serait alors intéressant d' ajouter une autre --verbosepour rsyncvoir ce qu'il fait. Je soupçonne que cela se répercute sur tous les fichiers inchangés, et si vous avez suffisamment de fichiers, cela prend simplement beaucoup de temps.

roaima
la source
--delete --delete-duringne l'a pas fait pour moi - qui a toujours envoyé une liste de fichiers incrémentielle - mais --delete --delete-beforeest allé directement à:, building file listce qui semble être un progrès majeur. Je pense.
mlissner
Non, c'est à l'envers, j'ai peur. Si vous utilisez --delete-before, rsynceffectue ensuite deux passes dans l'arborescence de fichiers: une pour les suppressions et la suivante pour la copie.
roaima
Merci. Dans ce cas ... un moyen d'éviter de construire la liste des fichiers incrémentiels?
mlissner
@mlissner cela dépend de plusieurs facteurs différents. Le plus important est de loin de savoir si vous effectuez une copie locale vers locale ou locale vers distante.
roaima
Tout est local à local pour moi, bien que l'un des habitants soit un disque USB?
mlissner
-2

vous pouvez utiliser -vvpour voir le journal complet de rsync.

namaiiee
la source
2
Comment cela répondrait-il à la question, c'est-à-dire comment cela accélérerait-il les choses?
Kusalananda
Vous pouvez simplement voir les journaux, ce qui montre pourquoi il a fallu autant de temps pour démarrer rsync, il y a peut-être des fichiers que vous pouvez ignorer de rsync pour réduire le temps.
namaiiee