Ich versuche, etwa 100.000 Dateien mit einer Gesamtgröße von 90 GB zu übertragen. Momentan verwende ich den Rsync-Daemon, aber der ist langsam (3,4 MBit/s) und ich muss das mehrmals machen. Ich frage mich, welche Möglichkeiten ich habe, um eine 100-MBit-Verbindung über das Internet maximal auszunutzen und sehr zuverlässig zu sein.
Antwort1
Haben Sie darüber nachgedachtSneakernet– Bei großen Datensätzen ist der Versand über Nacht oft schneller und günstiger als die Übertragung über das Internet.
Antwort2
Wie? Oder TL;DR
Die schnellste Methode, die ich gefunden habe, ist eine Kombination aus tar
, mbuffer
und ssh
.
Z.B:
tar zcf - bigfile.m4p | mbuffer -s 1K -m 512 | ssh otherhost "tar zxf -"
Damit habe ich dauerhafte lokale Netzwerkübertragungen mit über 950 Mbit/s auf 1-GB-Verbindungen erreicht. Ersetzen Sie die Pfade in jedem Tar-Befehl so, dass sie für das, was Sie übertragen, geeignet sind.
Warum? mbuffer!
Der mit Abstand größte Engpass bei der Übertragung großer Dateien über ein Netzwerk ist die Festplatten-E/A. Die Antwort darauf ist mbuffer
oder buffer
. Sie sind sich weitgehend ähnlich, mbuffer
haben aber einige Vorteile. Die Standardpuffergröße beträgt 2 MB für mbuffer
und 1 MB für buffer
. Größere Puffer sind wahrscheinlich nie leer. Die beste Leistung erzielen Sie, wenn Sie eine Blockgröße wählen, die das kleinste gemeinsame Vielfache der nativen Blockgröße sowohl auf dem Ziel- als auch auf dem Zieldateisystem ist.
Pufferung ist das, was machtalleder Unterschied!Benutzen Sie es, wenn Sie es haben! Wenn Sie es nicht haben, holen Sie es sich! Die Verwendung von (m}?buffer
allem zusammen ist besser als alles allein. Es ist fast buchstäblich ein Allheilmittel für langsame Netzwerkdateiübertragungen.
Wenn Sie mehrere Dateien übertragen, verwenden Sie , tar
um sie in einem einzigen Datenstrom zusammenzufassen. Wenn es sich um eine einzelne Datei handelt, können Sie cat
oder die E/A-Umleitung verwenden. Der Aufwand von tar
vs. cat
ist statistisch unbedeutend, daher verwende ich immer tar
(oder zfs -send
wo ich kann), es sei denn, es ist bereits einTarball. Keiner von beiden gibt Ihnen garantiert Metadaten (und cat
wird es insbesondere nicht). Wenn Sie Metadaten wollen, überlasse ich Ihnen das als Übung.
Schließlich ssh
ist die Verwendung als Transportmechanismus sicher und verursacht nur sehr wenig Mehraufwand. Auch hier ist der Mehraufwand von ssh
vs. nc
statistisch unbedeutend.
Antwort3
Sie erwähnen „rsync“, also nehme ich an, dass Sie Linux verwenden:
Warum erstellen Sie keine Tar- oder Tar.gz-Datei? Die Netzwerkübertragungszeit einer großen Datei ist kürzer als die vieler kleiner Dateien. Sie können die Datei sogar komprimieren, wenn Sie möchten ...
Tar ohne Komprimierung:
Auf dem Quellserver:
tar -cf file.tar /path/to/files/
Dann auf der Empfängerseite:
cd /path/to/files/
tar -xf /path/to/file.tar
Tar mit Komprimierung:
Auf dem Quellserver:
tar -czf file.tar.gz /path/to/files/
Dann auf der Empfängerseite:
cd /path/to/files/
tar -xzf /path/to/file.tar.gz
Für die eigentliche Übertragung der (tar|tar.gz)-Dateien verwenden Sie einfach rsync.
Antwort4
Sie können verschiedene Komprimierungsoptionen von rsync verwenden.
-z, --compress compress file data during the transfer
--compress-level=NUM explicitly set compression level
--skip-compress=LIST skip compressing files with suffix in LIST
Die Komprimierungsrate für Binärdateien ist sehr niedrig, daher können Sie diese Dateien mit „--skip-compress“ überspringen, z. B. ISO, bereits archivierte und komprimierte Tarballs usw.