tar + rsync + untar. Gibt es einen Geschwindigkeitsvorteil gegenüber Rsync?

25

Ich finde mich oft dabei, Ordner mit 10K - 100K Dateien an einen entfernten Computer zu senden (innerhalb desselben Netzwerks auf dem Campus).

Ich habe mich nur gefragt, ob es Gründe gibt, das zu glauben,

 tar + rsync + untar

Oder einfach

 tar (from src to dest) + untar

könnte in der Praxis schneller sein als

rsync 

beim erstmaligen Übertragen der Dateien .

Ich bin an einer Antwort interessiert, die das oben Genannte in zwei Szenarien anspricht: Komprimierung und Nichtverwendung.

Aktualisieren

Ich habe gerade einige Experimente durchgeführt, bei denen 10.000 kleine Dateien (Gesamtgröße = 50 MB) verschoben wurden, und tar+rsync+untarwar durchweg schneller als die rsyncdirekte Ausführung (beide ohne Komprimierung).

Amelio Vazquez-Reina
quelle
Führen Sie rsync am anderen Ende im Daemon-Modus aus?
JBRWilkinson
4
Re. Ihre Zusatzfrage:tar cf - . | ssh remotehost 'cd /target/dir && tar xf -'
Gilles 'SO- hör auf, böse zu sein'
3
Wenn Sie kleinere Dateien einzeln über rsync oder scp synchronisieren, startet jede Datei mindestens ein eigenes Datenpaket über das Netz. Wenn die Datei klein ist und es viele Pakete gibt, führt dies zu einem erhöhten Protokoll-Overhead. Rechnen Sie jetzt damit, dass für jede Datei auch mehr als ein Datenpaket per rsync-Protokoll vorhanden ist (Prüfsummen übertragen, vergleichen ...), der Protokoll-Overhead baut sich schnell auf. Siehe Wikipedia auf MTU-Größe
Tatjana Heuser
Danke @TatjanaHeuser - wenn Sie dies zu Ihrer Antwort hinzufügen und nichts dagegen haben, die Behauptung zu bestätigen, dass rsync mindestens ein Paket pro Datei verwendet, würde ich dies akzeptieren.
Amelio Vazquez-Reina
1
Ich fand eine interessante Lektüre, in der es heißt, dass die Verzögerung bei scp und rsync auf verschiedene Gründe zurückzuführen ist: scp verhält sich im Grunde genommen so, wie ich es beschrieben habe, aber rsync optimiert die Netzwerknutzlast zu den erhöhten Kosten für den Aufbau großer Datenstrukturen, um dies zu handhaben. Ich habe das in meine Antwort aufgenommen und werde es dieses Wochenende nachprüfen.
Tatjana Heuser

Antworten:

24

Wenn Sie den gleichen Satz von Dateien senden, rsyncist dies besser geeignet, da nur Unterschiede gesendet werden. tarwird immer alles senden und dies ist eine Verschwendung von Ressourcen, wenn viele der Daten bereits vorhanden sind. Das tar + rsync + untarverliert in diesem Fall diesen Vorteil sowie den Vorteil, die Ordner synchron zu halten rsync --delete.

Wenn Sie die Dateien zum ersten Mal kopieren, erst packen, dann senden und dann entpacken (AFAIK rsyncnimmt keine weitergeleiteten Eingaben entgegen), ist dies umständlich und immer schlimmer als nur das Synchronisieren, da rsyncSie keine Aufgabe mehr als tarohnehin erledigen müssen .

Tipp: rsync Version 3 oder höher führt eine inkrementelle Rekursion durch. Dies bedeutet, dass der Kopiervorgang fast unmittelbar bevor alle Dateien gezählt werden, gestartet wird.

Tipp2: Wenn Sie rsyncüber verwenden ssh, können Sie auch eines von beiden verwendentar+ssh

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

oder nur scp

scp -Cr srcdir user@server:destdir

Allgemeine Regel, halte es einfach.

AKTUALISIEREN:

Ich habe 59 Millionen Demo-Daten erstellt

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

und die Dateiübertragung auf einen Remote-Server (nicht im selben LAN) mit beiden Methoden mehrmals getestet

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

während Sie die Protokolle von den gesendeten SSH-Verkehrspaketen trennen

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

In diesem Fall kann ich keinen Vorteil bei weniger Netzwerkverkehr mit rsync + tar feststellen. Dies wird erwartet, wenn die Standard-MTU 1500 ist und die Dateien 10 KB groß sind. rsync + tar hatte mehr Verkehr generiert, war 2-3 Sekunden langsamer und hinterließ zwei Mülldateien, die bereinigt werden mussten.

Ich habe die gleichen Tests auf zwei Computern im selben LAN durchgeführt, und dort hat rsync + tar viel bessere Zeiten und viel weniger Netzwerkverkehr erzielt. Ich vermute wegen Jumbo Frames.

Vielleicht wäre rsync + tar besser als nur rsync für einen viel größeren Datensatz. Aber ehrlich gesagt denke ich nicht, dass es die Mühe wert ist, Sie brauchen auf jeder Seite doppelten Platz zum Packen und Auspacken, und es gibt ein paar andere Möglichkeiten, wie ich oben bereits erwähnt habe.

forcefsck
quelle
Tatsächlich. Das "nur was gebraucht wird" ist ein wichtiger Aspekt, obwohl es manchmal widerspenstig sein kann, dass das Biest gerufen wird rsync;)
0xC0000022L
2
Übrigens, wenn Sie das Flag zmit rsync verwenden, wird die Verbindung komprimiert. Mit der Menge an CPU-Leistung, die wir heutzutage haben, ist die Komprimierung im Vergleich zu der Menge an Bandbreite, die Sie sparen, trivial. Sie kann ~ 1/10 der unkomprimierten für Textdateien sein
Populus
1
@ Populus, Sie werden feststellen, dass ich die Komprimierung für meine ursprüngliche Antwort verwende. In den Tests, die ich später hinzufügte, spielt es jedoch keine Rolle, dass Daten aus urandom nicht stark komprimiert werden ... wenn überhaupt.
Forcefsck
8

rsyncmacht auch Komprimierung. Benutze die -zFlagge. Wenn sshSie überfahren, können Sie auch den Komprimierungsmodus von ssh verwenden. Ich habe das Gefühl, dass wiederholte Komprimierungsstufen nicht nützlich sind. Es werden nur Zyklen ohne signifikantes Ergebnis gebrannt. Ich würde empfehlen, mit rsyncKomprimierung zu experimentieren . Es scheint ziemlich effektiv zu sein. Und ich würde vorschlagen, die Verwendung von taroder jede andere Pre / Post-Komprimierung zu überspringen .

Normalerweise benutze ich rsync als rsync -abvz --partial....

Faheem Mitha
quelle
Beachten Sie, dass das rsyncKomprimieren von Dateien mit bestimmten Suffixen, einschließlich .gzund .tgzund anderen, standardmäßig übersprungen wird . Durchsuchen Sie die rsyncManpage nach --skip-compressfür die vollständige Liste.
Wildcard
5

Ich musste heute mein Home-Verzeichnis auf NAS sichern und bin auf diese Diskussion gestoßen, da ich dachte, ich würde meine Ergebnisse hinzufügen. Um es kurz zu machen: Das Tarieren über das Netzwerk auf das Zieldateisystem ist in meiner Umgebung viel schneller als das Synchronisieren auf dasselbe Ziel.

Umgebung: Quellcomputer i7-Desktop mit SSD-Festplatte. Zielcomputer Synology NAS DS413j mit einer Gigabit-LAN-Verbindung zum Quellcomputer.

Die genaue Spezifikation des betreffenden Kits wirkt sich natürlich auf die Leistung aus, und ich kenne die Details meines genauen Setups in Bezug auf die Qualität der Netzwerkhardware an jedem Ende nicht.

Die Quelldateien sind mein ~ / .cache-Ordner, der 1,2 GB großteils sehr kleiner Dateien enthält.

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

Ich habe 1a und 1b als völlig getrennte Schritte gehalten, um die Aufgabe zu veranschaulichen. Für praktische Anwendungen würde ich empfehlen, was Gilles oben gepostet hat, indem er die Teerausgabe über ssh an einen Vorgang zum Entgaren auf dem Empfänger weiterleitet.

Timings:

1a - 33 seconds

1b - 1 minutes 48 seconds

2 - 22 minutes

Es ist sehr klar, dass rsync im Vergleich zu einer tar-Operation erstaunlich schlecht lief, was vermutlich auf die oben erwähnte Netzwerkleistung zurückzuführen ist.

Ich würde jedem empfehlen, der große Mengen größtenteils kleiner Dateien sichern möchte, z. B. eine Sicherung des Basisverzeichnisses, den tar-Ansatz zu verwenden. rsync scheint eine sehr schlechte Wahl zu sein. Ich werde auf diesen Beitrag zurückkommen, wenn es scheint, dass ich in einem meiner Verfahren ungenau war.

Nick

Neek
quelle
1
Ohne die Verwendung -zvon rsync scheint dieser Test unvollständig zu sein.
Wildcard
1
Tar ohne eigenes zArgument, wie ich es verwendet habe, komprimiert keine Daten (siehe unix.stackexchange.com/questions/127169/… ), so weit ich sehen kann, ist die Verwendung von rsync ohne Komprimierung ein fairer Vergleich. Wenn ich die tar-Ausgabe durch eine Komprimierungsbibliothek wie bzip2 oder gzip leiten -zwürde , wäre das sinnvoll.
Neek
3

Die Verwendung von rsync zum Senden eines Tar-Archivs nach Aufforderung wäre eine Verschwendung oder eine Verschwendung von Ressourcen, da Sie dem Prozess eine Überprüfungsebene hinzufügen würden. Rsync würde die tar-Datei auf ihre Richtigkeit überprüfen, wenn Sie lieber die einzelnen Dateien überprüfen möchten. (Es hilft nicht, zu wissen, dass die Tar-Datei, die auf der sendenden Seite möglicherweise defekt war, auf der empfangenden Seite bereits den gleichen Effekt zeigt). Wenn Sie ein Archiv senden, brauchen Sie nur ssh / scp.

Der eine Grund, warum Sie möglicherweise das Senden eines Archivs auswählen müssen, wäre, wenn der Teer Ihrer Wahl in der Lage wäre, mehr Dateisystem-Specials wie die Zugriffssteuerungsliste oder andere Metadaten, die häufig in Extended Attributes (Solaris) oder Ressource Forks (MacOS) gespeichert sind, beizubehalten ). Wenn Sie sich mit solchen Dingen befassen, ist es Ihr Hauptanliegen, welche Tools in der Lage sind, alle Informationen, die der Datei im Quellendateisystem zugeordnet sind, zu speichern, sofern das Zieldateisystem die Möglichkeit hat, diese ebenfalls zu verfolgen.

Wenn Geschwindigkeit Ihr Hauptanliegen ist, hängt dies stark von der Größe Ihrer Dateien ab. Im Allgemeinen wird eine Vielzahl winziger Dateien schlecht über rsync oder scp skaliert, da alle einzelne Netzwerkpakete verschwenden, wobei eine tar-Datei mehrere davon innerhalb der Datenlast eines einzelnen Netzwerkpakets enthalten würde. Noch besser, wenn die TAR-Datei komprimiert wäre, da die kleinen Dateien höchstwahrscheinlich insgesamt besser komprimiert würden als einzeln. Soweit ich weiß, können sowohl rsync als auch scp nicht optimiert werden, wenn einzelne Dateien wie bei einer Erstübertragung gesendet werden. Dabei belegt jede Datei einen gesamten Datenrahmen mit dem gesamten Protokoll-Overhead (und verschwendet mehr Zeit für das Hin- und Herchecken). Jedoch Janecekgibt an, dass dies nur für scp zutrifft und dass rsync den Netzwerkverkehr optimieren würde, jedoch auf Kosten des Aufbaus großer Datenstrukturen im Speicher. Siehe Artikel Efficient File Transfer, Janecek 2006 . Ihm zufolge ist es immer noch wahr, dass scp und rsync bei kleinen Dateien schlecht skalieren, aber aus ganz anderen Gründen. Ich schätze, ich muss dieses Wochenende nach Quellen suchen, um das herauszufinden.

Wenn Sie wissen, dass Sie größtenteils größere Dateien senden, gibt es aus praktischen Gründen keinen großen Geschwindigkeitsunterschied, und die Verwendung von rsync hat den zusätzlichen Vorteil, dass Sie in der Lage sind, zu übernehmen, wo es bei einer Unterbrechung aufgehört hat.

Postscriptum: In diesen Tagen scheint rdist in Vergessenheit zu geraten, aber vor den Tagen von rsync war es ein sehr leistungsfähiges und weit verbreitetes Werkzeug (sicher bei Verwendung über ssh, unsicher ansonsten). Ich würde allerdings nicht so gut wie rsync abschneiden, da es nicht optimiert wurde, nur geänderte Inhalte zu übertragen. Der Hauptunterschied zu rsync liegt in der Art und Weise, wie es konfiguriert ist und wie die Regeln für das Aktualisieren von Dateien formuliert sind.

Tatjana Heuser
quelle
Rsync fügt keine Überprüfungsebene hinzu. Es werden nur Prüfsummen verwendet, um Unterschiede in vorhandenen Dateien zu finden, nicht um das Ergebnis zu überprüfen. Wenn die Kopie frisch ist, werden keine Prüfsummen erstellt. Wenn die Kopie nicht frisch ist, sparen Sie durch Prüfsummen Bandbreite.
Forcefsck
2

Bei kleinen Verzeichnissen (klein wie der belegte Speicherplatz) hängt dies vom Aufwand ab, mit dem die Dateiinformationen für die zu synchronisierenden Dateien überprüft werden. Auf der einen Seite,rsync spart es Zeit beim Übertragen der unveränderten Dateien, andererseits müssen Informationen zu jeder Datei übertragen werden.

Ich kenne die Interna von nicht genau rsync. Ob die Dateistatistiken Verzögerung verursachen, hängt davon ab, wiersync Daten übertragen werden. Wenn die Dateistatistiken einzeln übertragen werden, kann die RTT tar + rsync + untar schneller machen.

Aber wenn Sie 1 GB Daten haben, wird Rsync viel schneller sein, es sei denn, Ihre Verbindung ist wirklich schnell!

njsg
quelle
1

Ich musste genau einmal ein paar Terabyte Daten im ganzen Land verschieben. Als Experiment habe ich zwei der Übertragungen mit rsyncund durchgeführt, um ssh/tarzu sehen, wie sie verglichen werden.

Die Ergebnisse:

  • rsync übertragen die Dateien mit einer durchschnittlichen Rate von 2,76 Megabyte pro Sekunde.
  • ssh/tar übertragen die Dateien mit einer durchschnittlichen Rate von 4,18 Megabyte pro Sekunde.

Die Details: Meine Daten bestehen aus Millionen von .gz-komprimierten Dateien, deren durchschnittliche Größe 10 Megabyte beträgt, einige jedoch mehr als ein Gigabyte. Es gibt eine Verzeichnisstruktur, die jedoch durch die Größe der Daten in den Dateien in den Schatten gestellt wird. Wenn ich fast noch etwas zu tun hätte, hätte ich nur verwendet, rsyncaber in diesem Fall ist das ssh/tareine funktionale Lösung.

Mein Job bei rsyncbesteht aus:

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

Dabei ist fileList.txt eine lange Liste der relativen Pfadnamen der Dateien auf der anderen Seite. (Mir ist aufgefallen, dass das --compressfür komprimierte Dateien nach dem Start nicht produktiv ist, ich aber keinen Neustart durchführen wollte.)

Ich habe eine andere mit ssh und tar gestartet, die folgendes hat:

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

Sie werden feststellen, dass dies alles kopiert, sorry, dies ist kein 100% iger Vergleich zwischen Äpfeln.

Ich sollte hinzufügen, dass ich, während ich das interne Firmennetzwerk benutze, einen Vermittler zu Rate ziehen muss, um an den Datenquellencomputer zu gelangen. Die Ping-Zeit von meinem Zielcomputer zum Intermediär beträgt 21 ms und vom Intermediär zur Datenquelle 26 ms. Dies war für beide Transfers gleich.

Die SSL-Verbindung über den Vermittler erfolgt über den ~/.ssh/configEintrag:

Host otherSystem
    Hostname dataSource.otherSide.com
    User myUser
    Port 22
    ProxyCommand ssh -q -W %h:%p intermediary.otherSide.com
    IdentityFile   id_rsa.priv
user1683793
quelle
Update: Sechs Stunden nach der ssh / tar-Übertragung hat mein System beschlossen, die Verbindung zu dem SAN-Gerät zu trennen, auf das ich Daten verschoben habe. Jetzt muss ich herausfinden, was übertragen wurde und was nicht, was ich wahrscheinlich mit rsync tun werde. Manchmal lohnt es sich nicht, Zeit zu sparen.
user1683793
0

Zeit dies:

tar cf - ~/.cache | ssh admin@nas_box "(cd /destination ; tar xf -)"
user33553
quelle