web-dev-qa-db-fra.com

Tar + rsync + endommage. Toute prestation de vitesse sur juste rsync?

Je me trouve souvent en envoyant des dossiers avec 10K - 100k de fichiers à une machine distante (dans le même réseau sur le campus).

Je me demandais simplement s'il y a des raisons de croire que,

 tar + rsync + untar

Ou simplement

 tar (from src to dest) + untar

pourrait être plus rapide dans la pratique que

rsync 

lors du transfert des fichiers pour la première fois.

Je suis intéressé par une réponse qui aborde ce qui précède dans deux scénarios: utiliser la compression et ne pas l'utiliser.

Mettre à jour

Je viens de gérer certaines expériences en déplaçant 10 000 petits fichiers (taille totale = 50 Mo) et tar+rsync+untar était systématiquement plus rapide que la course rsync directement (à la fois sans compression).

26

Lorsque vous envoyez le même ensemble de fichiers, rsync est mieux adapté car il n'enverra que des différences. tar _ vous enverra toujours tout et il s'agit d'un gaspillage de ressources lorsque beaucoup de données sont déjà là. Les tar + rsync + untar perd cet avantage dans ce cas, ainsi que l'avantage de garder les dossiers en synchronisation avec rsync --delete.

Si vous copiez les fichiers pour la première fois, d'abord l'envoi d'un premier paquet, puis de déballer (Afaik rsync _ ne prend pas d'entrée de canalisation) est encombrant et pire que de simplement rsyncing, car rsync gagné Il faut faire une tâche plus que tar de toute façon.

Conseil: RSYNC version 3 ou ultérieure effectue une récursion incrémentielle, ce qui signifie qu'il commence à copier presque immédiatement avant de compter tous les fichiers.

TIP2: Si vous utilisez rsync sur ssh, vous pouvez également utiliser tar+ssh

tar -C /src/dir -jcf - ./ | ssh user@server 'tar -C /dest/dir -jxf -'

ou juste scp

scp -Cr srcdir user@server:destdir

Règle générale, gardez-la simple.

Mise à jour :

J'ai créé des données de démonstration de 59m

mkdir tmp; cd tmp
for i in {1..5000}; do dd if=/dev/urandom of=file$i count=1 bs=10k; done

et testé plusieurs fois le transfert de fichier sur un serveur distant (non dans le même réseau local), à l'aide des deux méthodes

time rsync -r  tmp server:tmp2

real    0m11.520s
user    0m0.940s
sys     0m0.472s

time (tar cf demo.tar tmp; rsync demo.tar server: ; ssh server 'tar xf demo.tar; rm demo.tar'; rm demo.tar)

real    0m15.026s
user    0m0.944s
sys     0m0.700s

tout en gardant des journaux séparés des paquets de trafic SSH envoyés

wc -l rsync.log rsync+tar.log 
   36730 rsync.log
   37962 rsync+tar.log
   74692 total

Dans ce cas, je ne peux voir aucun avantage en moins de trafic réseau en utilisant le goudron RSYNC +, qui est attendu lorsque le MTU par défaut est de 1500 et que les fichiers sont de 10 000 de 10 000. RSYNC + TAR avait plus de trafic généré, était plus lent pendant 2-3 secondes et a laissé deux fichiers déchets qui devaient être nettoyés.

J'ai fait les mêmes tests sur deux machines sur le même réseau local, et là, le goudron RSYNC + a beaucoup fait de beaucoup de temps et beaucoup moins de trafic réseau. Je suppose que la cause des cadres jumbo.

Peut-être que rsync + goudron serait mieux que de simplement rsync sur un ensemble de données beaucoup plus grand. Mais franchement, je ne pense pas que cela mérite la peine, vous avez besoin d'un double espace de chaque côté pour l'emballage et le déballage, et il y a quelques autres options que j'ai déjà mentionnées ci-dessus.

25
forcefsck

rsync aussi compression. Utilisez le -z drapeau. Si vous courez sur ssh, vous pouvez également utiliser le mode de compression de SSH. Mon sentiment est que les niveaux répétés de compression ne sont pas utiles; Il va simplement brûler des cycles sans résultat important. Je recommanderais d'expérimenter la compression rsync. Cela semble assez efficace. Et je suggérerais de sauter l'utilisation de tar ou de toute autre compression pré/post.

J'utilise habituellement rsync comme rsync -abvz --partial....

8
Faheem Mitha

Je devais sauvegarder mon annuaire de domicile sur NAS aujourd'hui et courir dans cette discussion, pensais que j'ajouterais mes résultats. Longue histoire courte, tarvoir sur le réseau au système de fichiers cible est chemin plus rapide dans mon environnement que de rsyncing à la même destination.

Environnement: Machine source I7 de bureau à l'aide d'un disque dur SSD. Synologie de la machine de destination NAS DS413J sur une connexion Gigabit LAN à la machine source.

La spécification exacte du kit impliqué aura une incidence sur la performance, naturellement, et je ne connais pas les détails de ma configuration exacte en ce qui concerne la qualité du matériel réseau à chaque extrémité.

Les fichiers source sont mon dossier ~/.cache qui contient 1,2 Go de très petits fichiers.

1a/ tar files from source machine over the network to a .tar file on remote machine

$ tar cf /mnt/backup/cache.tar ~/.cache

1b/ untar that tar file on the remote machine itself

$ ssh admin@nas_box
[admin@nas_box] $ tar xf cache.tar

2/ rsync files from source machine over the network to remote machine

$ mkdir /mnt/backup/cachetest
$ rsync -ah .cache /mnt/backup/cachetest

J'ai gardé 1A et 1B comme des étapes complètement séparées pour illustrer la tâche. Pour les applications pratiques, je recommanderais ce que les Gilles ont affiché ci-dessus impliquant la sortie du goudron de tuyauterie via SSH à un processus d'abrure sur le récepteur.

Timings:

1a - 33 seconds

1b - 1 minutes 48 seconds

2 - 22 minutes

Il est très clair que RSYNC a été incroyablement mal comparé à une opération de goudron, qui peut probablement être attribuée aux performances du réseau mentionnées ci-dessus.

Je recommanderais tous ceux qui souhaitent sauvegarder de grandes quantités de gros fichiers, tels que la sauvegarde d'annuaire de domicile, utilisez l'approche tar. RSYNC semble un très mauvais choix. Je reviendrai à ce post s'il semble que j'ai été inexact dans une de mes procédures.

Pseudo

5
Neek

En utilisant RSYNC pour envoyer une archive de goudron, comme on l'a demandé serait un gaspillage ou des ressources, car vous ajoutez une couche de vérification au processus. RSYNC serait checksum le fichier tar pour l'exactitude, lorsque vous préférez avoir la vérification des fichiers individuels. (Cela n'aide pas à savoir que le fichier de goudron qui a peut-être été défectueux sur le côté de l'envoi montre déjà le même effet sur la fin de réception). Si vous envoyez une archive, SSH/SCP est tout ce dont vous avez besoin.

La seule raison pour laquelle vous devrez peut-être choisir l'envoi d'une archive serait si le goudron de votre choix a pu conserver plus de spéciaux de système de fichiers, tels que la liste de contrôle d'accès ou d'autres métadonnées souvent stockées dans des attributs étendus (Solaris) ou des fourches de Ressource (MacOS ). Lorsque vous traitez avec de telles choses, votre principale préoccupation sera celle que des outils sont en mesure de préserver toutes les informations associées au fichier du système de fichiers source, en fournissant au système de fichiers cible la capacité de les suivre également.

Lorsque la vitesse est votre principale préoccupation, cela dépend beaucoup de la taille de vos fichiers. En règle générale, une multitude de fichiers minuscules échouent mal sur RSYNC ou SCP, car ils gaspilleraient toutes les paquets de réseau individuels individuels, où un fichier de goudron comprendrait plusieurs d'entre eux dans la charge de données d'un seul paquet réseau. Encore mieux si le fichier de goudron était comprimé, car les petits fichiers se compressaient probablement mieux à leur ensemble que individuellement. Pour autant que je sache, RSYNC et SCP ne parviennent pas à optimiser lors de l'envoi de fichiers uniques entiers comme dans un transfert initial, avec chaque fichier occupant une trame de données complète avec tout son protocole au-dessus de la tête (et de perdre davantage sur la vérification et l'arrière). Toutefois janecek stipule que cela soit vrai pour le SCP uniquement, démontrant que RSYNC optimiserait le trafic réseau, mais au coût de la construction d'énormes structures de données en mémoire. Voir l'article Transfert de fichiers efficace, Janecek 2006 . Donc, selon lui, il est toujours vrai que SCP et RSYNC échouent mal sur de petits fichiers, mais pour des raisons entièrement différentes. Je suppose que je devrais creuser dans des sources ce week-end pour le savoir.

Pour une pertinence pratique, si vous savez que vous envoyez principalement des fichiers plus volumineux, il n'y aura pas une grande différence de vitesse et utiliser RSSYNC a également avantageux d'être capable de participer là où il est laissé lorsqu'il est interrompu.

Postscriptum: Ces jours-ci, RDIST Semble s'enfoncer dans l'oubli, mais avant la journée de RSYNC, c'était un outil très capable et largement utilisé (en toute sécurité lorsqu'il est utilisé sur SSH, dangereux). Je ne jouerais pas aussi bien que RSYNC, car cela n'a pas optimisé pour simplement transférer du contenu qui avait changé. Sa principale différence pour RSYNC réside dans la manière dont il est configuré et la manière dont les règles de mise à jour des fichiers sont épelées.

3
Tatjana Heuser

Pour les petits répertoires (petits comme dans l'espace disque utilisé), cela dépend de la surcharge de la vérification des informations de fichier pour les fichiers synchronisés. D'une part, rsync enregistre l'heure de transfert des fichiers non modifiés, d'autre part, il doit en effet transférer des informations sur chaque fichier.

Je ne sais pas exactement les internes de rsync. Si les statistiques de fichiers causent le décalage dépend de la manière dont les données de transferts rsync - si les statistiques de fichier sont transférées une par une, puis le RTT peut faire du goudron + rsync + sans plus rapidement.

Mais si vous avez, dites 1 GiB de données, RSYNC sera bien plus rapide, si votre connexion est vraiment rapide!

2
njsg

J'ai dû déplacer quelques téraoctets de données à travers le pays, exactement une fois. En tant qu'expérience, j'ai dirigé deux des transferts en utilisant rsync et ssh/tar Pour voir comment ils se comparent.

Les résultats :

  • rsync transféré les fichiers à un taux moyen de 2,76 mégaoctets par seconde.
  • ssh/tar transféré les fichiers à un taux moyen de 4,18 mégaoctets par seconde.

Les détails : Mes données se compose de millions de fichiers compressés .gz, dont la taille moyenne est de 10 mégaoctets, mais certaines sont sur un gigaoctet. Il existe une structure de répertoire mais il est nain de la taille des données à l'intérieur des fichiers. Si j'avais presque autre chose à faire, je n'aurais utilisé que rsync mais dans ce cas, le ssh/tar est une solution fonctionnelle.

Mon travail avec rsync consiste en:

rsync --compress --stats --no-blocking-io --files-from=fileList.txt -av otherSystem:/the/other/dir/ dest/

où FileList.txt est une grande longue liste des noms de chemin relatifs des fichiers de l'autre côté. (J'ai remarqué que le --compress n'est pas productif pour les fichiers compressés après avoir commencé mais je n'allais pas revenir en arrière.)

J'ai entamé un autre avec ssh et tar qui a:

ssh otherSystem "cd /the/other/dir/;  tar cf - ." | tar xvf -

Vous observerez ces copies tout, désolé ce n'est pas une comparaison de pommes à 100% à pommes.

Je devrais ajouter que lorsque j'utilise le réseau de la société interne, je dois passer par un intermédiaire pour vous rendre à l'ordinateur de source de données. Le temps de ping de mon ordinateur cible à l'intermédiaire est de 21 ms et de l'intermédiaire à la source de données est de 26 ms. C'était la même chose pour les deux transferts.

La connexion SSL à travers l'intermédiaire est accomplie via le ~/.ssh/config Entrée:

Host otherSystem
    Hostname dataSource.otherSide.com
    User myUser
    Port 22
    ProxyCommand ssh -q -W %h:%p intermediary.otherSide.com
    IdentityFile   id_rsa.priv
1
user1683793