J'utilise un rsync
script pour synchroniser les données d'un hôte avec les données d'un autre hôte. Les données contiennent de nombreux fichiers de petite taille qui contribuent à près de 1,2 To.
Afin de synchroniser ces fichiers, j'ai utilisé la rsync
commande comme suit:
rsync -avzm --stats --human-readable --include-from proj.lst /data/projects REMOTEHOST:/data/
Le contenu de proj.lst est le suivant:
+ proj1
+ proj1/*
+ proj1/*/*
+ proj1/*/*/*.tar
+ proj1/*/*/*.pdf
+ proj2
+ proj2/*
+ proj2/*/*
+ proj2/*/*/*.tar
+ proj2/*/*/*.pdf
...
...
...
- *
Comme test, j'ai récupéré deux de ces projets (8,5 Go de données) et j'ai exécuté la commande ci-dessus. Étant un processus séquentiel, il nécessite 14 minutes 58 secondes pour terminer. Ainsi, pour 1,2 To de données, cela prendrait plusieurs heures.
Si je pouvais plusieurs rsync
processus en parallèle (en utilisant &
, xargs
ou parallel
), cela me ferait gagner du temps.
J'ai essayé avec la commande ci-dessous avec parallel
(après cd
ing dans le répertoire source) et cela a pris 12 minutes 37 secondes pour s'exécuter:
parallel --will-cite -j 5 rsync -avzm --stats --human-readable {} REMOTEHOST:/data/ ::: .
Cela aurait dû prendre 5 fois moins de temps, mais ce ne fut pas le cas. Je pense que je me trompe quelque part.
Comment puis-je exécuter plusieurs rsync
processus afin de réduire le temps d'exécution?
la source
rsync
s est notre première priorité.rsync
s en parallèle est désormais l'objectif principal.Réponses:
Les étapes suivantes ont fait le travail pour moi:
rsync --dry-run
premier afin d'obtenir la liste des fichiers qui seraient affectés.cat transfer.log
toparallel
pour exécuter 5rsync
s en parallèle, comme suit:Ici, l'
--relative
option ( lien ) garantit que la structure du répertoire des fichiers affectés, à la source et à la destination, reste la même (/data/
répertoire interne ), de sorte que la commande doit être exécutée dans le dossier source (par exemple,/data/projects
).la source
split
et de mettre ces noms de fichiers en parallèle. Utilisez ensuite rsync--files-from
pour extraire les noms de fichiers de chaque fichier et les synchroniser. sauvegardes rm. * split -l 3000 backup.list sauvegardes. ls sauvegardes. * | parallel --line-buffer --verbose -j 5 rsync --progress -av --files-from {} / LOCAL / PARENT / PATH / REMOTE_HOST: REMOTE_PATH /receiving file list ... done
created directory /data/
.--info=name
à la place de-v
, et vous n'obtiendrez que les noms des fichiers et des répertoires. Vous pouvez également utiliser --protect-args pour le rsync de transfert «interne» si des fichiers peuvent contenir des espaces ou des métacaractères shell.J'utilise personnellement ce simple:
Ce qui n'est utile que lorsque vous avez plus de quelques répertoires non vides, sinon vous finirez par avoir presque tous les
rsync
terminaisons et le dernier fera tout le travail seul.la source
Je découragerais fortement quiconque d'utiliser la réponse acceptée, une meilleure solution consiste à explorer le répertoire de niveau supérieur et à lancer un nombre proportionnel d'opérations de rync.
J'ai un grand volume zfs et ma source était une monture cifs. Les deux sont liés à 10G, et dans certains cas-tests peuvent saturer le lien. La performance a été évaluée en utilisant
zpool iostat 1
.Le lecteur source a été monté comme suit:
En utilisant un seul
rsync
processus:le compteur io indique:
Ceci dans les benchmarks synthétiques (disque cristal), les performances d'écriture séquentielle approchent 900 Mo / s ce qui signifie que le lien est saturé. 130 Mo / s n'est pas très bon, et la différence entre attendre un week-end et deux semaines.
J'ai donc construit la liste des fichiers et essayé de relancer la synchronisation (j'ai une machine 64 core):
et il avait les mêmes performances!
Comme alternative, j'ai simplement exécuté rsync sur les dossiers racine:
Cela a en fait amélioré les performances:
En conclusion, comme l'a évoqué @Sandip Bhattacharya, écrivez un petit script pour obtenir les répertoires et parallèlement. Vous pouvez également transmettre une liste de fichiers à rsync. Mais ne créez pas de nouvelles instances pour chaque fichier.
la source
Une façon testée de faire la rsync parallélisée est: http://www.gnu.org/software/parallel/man.html#EXAMPLE:-Parallelizing-rsync
la source
find
?--dry-run
option dansrsync
, j'aurais une liste de fichiers qui seraient transférés. Puis-je fournir cette liste de fichiersparallel
afin de paralléliser le processus?mkdir -p /dest-dir/{//}\;
partie? Surtout, la{//}
chose est un peu déroutante.Pour les synchronisations multi-destinations, j'utilise
Astuce: toutes les connexions ssh sont établies avec des clés publiques dans
~/.ssh/authorized_keys
la source
Je recherche toujours Google pour la synchronisation parallèle car j'oublie toujours la commande complète, mais aucune solution n'a fonctionné pour moi comme je le souhaitais - soit elle comprend plusieurs étapes ou doit être installée
parallel
. J'ai fini par utiliser ce one-liner pour synchroniser plusieurs dossiers:-P 5
est la quantité de processus que vous souhaitez générer - utilisez 0 pour illimité (évidemment non recommandé).--bwlimit
pour éviter d'utiliser toute la bande passante.-I %
argument fourni par find (répertoire trouvé dansdir/
)$(echo dir/%/ host:/dir/%/)
- affiche les répertoires source et de destination qui sont lus par rsync comme arguments. % est remplacé par lexargs
nom du répertoire trouvé parfind
.Supposons que j'ai deux répertoires dans
/home
:dir1
etdir2
. Je coursfind /home -type d|xargs -P 5 -I % sh -c 'rsync -a --delete --bwlimit=50000 $(echo /home/%/ host:/home/%/)'
. La commande rsync s'exécutera donc comme deux processus (deux processus car/home
a deux répertoires) avec les arguments suivants:la source