Wenn Sie rsync
in einer Situation mit hoher Latenz und hoher Bandbreite verwenden, ist die Übertragungsrate pro Verbindung langsamer [1] als y unsere verfügbare Bandbreite. Für das angegebene Beispiel beträgt Ihre erwartete Übertragungsgeschwindigkeit 56,25 KiB oder weniger als 10% der verfügbaren Bandbreite.
Eine Lösung ist N rsync
Prozesse parallel auszuführen:
#!/bin/bash
# tar up the files
tar -cvzf x.tar ${list_of_files}
# [optional]
# compute the md5sum
md5sum x.tar > x.tar.md5sum
# break the large tar file into N files (i.e. x.tar would become x.tar.1 ... x.tar.N)
# TODO
# start N `rsync` processes in parallel
for ((i=1;i<=N;i++)); do rsync -avzh x.tar.${i} ${destination} & done
# wait for the transfers to finish
wait && echo "success" || echo "fail" && exit 1
# stitch the N files back together into x.tar
TODO
# [optional... but gives everyone a nice warm and fuzzy]
# copy the md5sum and verify your files (even though `rsync` already did so)
scp x.tar.md5sum ${destination}
ssh ${destination_machine} "cd ${path} && md5sum -c x.tar.md5sum && echo 'PASS (files verified with md5sum)' || echo 'FAIL (file verification failed md5sum)' && exit 1"
# done!
[1] Warum ist Ihre Übertragungsgeschwindigkeit zu niedrig in diesem Beispiel?
Mit einem Wort: bandwidth-delay product (drei Worte tatsächlich)
Dies ist ein Beispiel für eine hohe Latenz und hoher Bandbreite Link. Einige könnten ein Tool wie rsync
verwenden, um ihre Daten zu übertragen. Wenn Sie eine Instanz von rsync
(oder etwas Ähnliches, das auch TCP oder TCP-ähnliches Protokoll verwendet) ausführen, werden Sie die verfügbare Bandbreite nicht verwenden.
Der Grund für die Verlangsamung hat mit der Umlaufart von TCP (oder TCP-ähnlichen Protokollen) zu tun, die ACKs erfordert, bevor mehr Daten gesendet werden. Das Problem wird formal als bandwidth-delay product bezeichnet. Jede Verbindungsgeschwindigkeit wird durch die Latenzzeit mehr als die Bandbreite begrenzt.
Speziell für das angegebene Beispiel beträgt die theoretische Geschwindigkeit 56,25 KiB oder weniger als 10% Ihrer verfügbaren Bandbreite. Die Begrenzung ist pro Verbindung. Mit nur einersync
für Ihre Dateiübertragung wird nicht vollständig Ihre Bandbreite nutzen.
Lösung 1:
Verwenden Sie ein anderes Programm, das nicht ein TCP-Protokoll wie nicht verwendet, aber immer noch garantiert, dass Ihre Daten durch andere Mittel (eine schnelle Google-Suche ist so etwas wie uftp
, die die Daten über die UDP-Protokoll übertragen stattdessen von TCP). Leider ist uftp
immer noch nicht in vielen Distributionen, wie dies geschrieben wurde.
Lösung 2:
weiter ein rsync
und ändern auf beiden Seiten der TCP-Netzwerkparameter verwenden, aber dies erfordert Expertenwissen, das ich im Moment nicht ohne weiteres verfügbar sind.
Lösung 3:
Run mehr rsync
Prozesse parallel wie am Anfang dieser Frage beschrieben.
* Ändern Sie Ihre TCP-Netzwerkparameter * [TCP-Skalierung] (https://en.wikipedia.org/wiki/TCP_window_scale_option) sollte theoretisch funktionieren, und es sollte im Betriebssystem des OPs aktiviert werden. Natürlich ist die Theorie keine Realität. –
Autor von [UFTP] (http://uftp-multicast.sourceforge.net) hier. Auch wenn es nicht in Ihrer Distribution ist, sollte das Bauen aus der Quelle ziemlich einfach sein. Binärdateien für Windows sind ebenfalls verfügbar. – dbush