Ich versuche, einen Stapel von Dateien mit zu kopieren, scp
aber es ist sehr langsam. Dies ist ein Beispiel mit 10 Dateien:
$ time scp cap_* user@host:~/dir
cap_20151023T113018_704979707.png 100% 413KB 413.2KB/s 00:00
cap_20151023T113019_999990226.png 100% 413KB 412.6KB/s 00:00
cap_20151023T113020_649251955.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_284028464.png 100% 417KB 416.8KB/s 00:00
cap_20151023T113021_927950468.png 100% 413KB 413.0KB/s 00:00
cap_20151023T113022_567641507.png 100% 413KB 413.1KB/s 00:00
cap_20151023T113023_203534753.png 100% 414KB 413.5KB/s 00:00
cap_20151023T113023_855350640.png 100% 412KB 411.7KB/s 00:00
cap_20151023T113024_496387641.png 100% 412KB 412.3KB/s 00:00
cap_20151023T113025_138012848.png 100% 414KB 413.8KB/s 00:00
cap_20151023T113025_778042791.png 100% 413KB 413.4KB/s 00:00
real 0m43.932s
user 0m0.074s
sys 0m0.030s
Das Seltsame ist, dass die Übertragungsrate etwa 413 KB / s und die Dateigröße etwa 413 KB beträgt. Daher sollte wirklich eine Datei pro Sekunde übertragen werden, es dauert jedoch etwa 4,3 Sekunden pro Datei.
Irgendeine Idee, woher dieser Overhead kommt, und gibt es eine Möglichkeit, ihn schneller zu machen?
scp
time
batch-jobs
laurent
quelle
quelle
Antworten:
@wurtels Kommentar ist wahrscheinlich richtig: Es gibt eine Menge Overhead beim Herstellen jeder Verbindung. Wenn Sie das beheben können, erhalten Sie schnellere Übertragungen (und wenn nicht, verwenden Sie einfach die Problemumgehung von @ roaima
rsync
). Ich habe ein Experiment durchgeführt, bei dem Dateien mit ähnlicher Größe (head -c 417K /dev/urandom > foo.1
und einige Kopien dieser Datei) auf einen Host übertragen wurden, dessen Verbindung eine Weile dauert (HOST4) und der sehr schnell reagiert (HOST1):quelle
Sie könnten
rsync
(overssh
) verwenden, das eine einzige Verbindung verwendet, um alle Quelldateien zu übertragen.Wenn Sie nicht haben
rsync
(und warum !? nicht) können Sie verwenden ,tar
mitssh
wie diese, die eine temporäre Datei vermeidet erstellen:Das
rsync
ist vorzuziehen, alle anderen Dinge sind gleich, da es im Falle einer Unterbrechung neu gestartet werden kann.quelle
scp
Aufruf nicht eine einzige Verbindung zum Übertragen aller Dateien verwenden würde?f -
auf jeder Seite nicht erforderlich , da tar standardmäßig nach stdout / stdin ausgibt / von dort liest.tar cz cap_* | ssh user@host tar xvzC dir
Würde es also tun.tar
kann mit verschiedenen Standardwerten kompiliert werden (sehentar --show-defaults
Sie, ob Sie GNU tar verwenden oder/etc/default/tar
nicht, und vergessen Sie in beiden Fällen dieTAPE
Umgebungsvariable nicht)scp
für jede datei eine neue verbindung erstellt werden würde, aber bei der erinnerung - und nach zweimaliger überprüfung mittshark
- stellte ich fest, dass ich falsch war. Zu diesem Zeitpunkt bin ich mir nicht mehr sicher, warum die OPsscp
pro Datei so lange dauern sollten.Es ist die Aushandlung des Transfers, die Zeit braucht. Im Allgemeinen dauern Operationen an n Dateien mit jeweils b Bytes viel, viel länger als eine einzelne Operation an einer einzelnen Datei mit n * b Bytes. Dies gilt auch zB für Disk I / O.
Wenn Sie genau hinschauen, werden Sie feststellen, dass die Übertragungsrate in diesem Fall die Größe der Datei / s beträgt .
Um Dateien effizienter zu übertragen, bündeln Sie sie mit
tar
und übertragen Sie dann den Tarball:tar cvf myarchive.tar cap_20151023T*.png
oder, wenn Sie auch das Archiv komprimieren möchten,
tar cvzf myarchive.tar.gz myfile*
Ob komprimiert werden soll oder nicht, hängt vom Dateiinhalt ab, z. Wenn es sich um JPEGs oder PNGs handelt, hat die Komprimierung keine Auswirkung.
quelle
-z
tar
normalerweise ein zweiter Durchgang für die Komprimierung ausgeführt wird oder ob gleichzeitig komprimiert und archiviert wird-z
CPU-gebunden und viel langsamer. gzip versucht immer zu komprimieren, daher die Verlangsamung; Schließlich können Sie nicht feststellen, ob eine Zeichenfolge von Bytes komprimierbar ist, bis Sie versucht haben, sie zu komprimieren. In meiner Konfiguration ist rsync ohne Komprimierung selbst beim Übertragen von Nur-Text-Dateien um den Faktor 2-3 schneller als die leichteste Komprimierung. Natürlich YMMV.Ein weiterer Grund dafür, dass scp langsamer ist als es sein sollte, insbesondere in Netzwerken mit hoher Bandbreite, besteht darin, dass statisch definierte interne Puffer zur Flusskontrolle vorhanden sind, die zu Engpässen bei der Netzwerkleistung führen.
HPN-SSH ist eine gepatchte Version von OpenSSH, die die Größe dieser Puffer erhöht. Die Übertragungsgeschwindigkeit von scp ändert sich massiv (siehe die Grafiken auf der Website, aber ich spreche auch aus eigener Erfahrung). Natürlich müssen Sie HPN-SSH auf allen Ihren Hosts installieren, um die Vorteile zu nutzen. Es lohnt sich jedoch, wenn Sie regelmäßig große Dateien übertragen müssen.
quelle
Ich habe die hier beschriebene Technik verwendet, die paralleles gzip und Netcat verwendet, um Daten schnell zu komprimieren und zu kopieren.
Es läuft auf Folgendes hinaus:
Dies verwendet tar, um die Datei oder die Dateien zu sammeln. Verwenden Sie dann pigz, um viele CPU-Threads zum Komprimieren und Senden der Datei abzurufen. Die Netzwerkübertragung erfolgt über netcat. Auf der Empfängerseite lauscht netcat und dekomprimiert (parallel) und entpackt.
quelle
nc
ist nicht verschlüsselt.ssh -D
Vielleicht etwas Magie hinzufügen?Hatte gerade dieses Problem eine Site-to-Site-Übertragung einer großen mp4-Datei über
scp
. Bekam ~ 250KB / s. Nach dem Deaktivieren des UDP-Flood-Schutzes (FP) auf der Ziel-Firewall stieg die Übertragungsrate auf 6,5 MB / s. Beim Wiedereinschalten von FP fiel die Rate auf ~ 250 KB / s zurück.Absender: cygwin, Empfänger: Fedora 20, Firewall Sophos UTM.
Wofür verwendet SSH UDP? @ superuser.com - Es geht nicht direkt um das, was ich gelesen habe.
Bei der Überprüfung des Firewall-Protokolls wurde eine Überflutungserkennung sowohl an den Quell- als auch an den Zielports 4500 über die öffentlichen IP-Adressen und nicht über die internen VPN-Adressen von privatem Standort zu Standort durchgeführt. Es scheint also, dass es sich bei meinem Problem wahrscheinlich um eine NAT-Traversal-Situation handelt, in der die
scp
TCP-Daten letztendlich verschlüsselt und in ESP- und UDP-Paketen gekapselt sind und folglich der FP unterliegen. Umscp
mich von der Gleichung zu entfernen , habe ich einen Windows-Dateikopiervorgang über das VPN ausgeführt und eine ähnliche Leistung wiescp
mit und ohne aktiviertem FP festgestellt .iperf
Lief auch einen Test über TCP und bemerkte 2 Mbit / s mit FP und 55 Mbit / s ohne.Wie funktioniert NAT-T mit IPSec? @ cisco.com
quelle