Was genau macht das `-C` Flag in` scp`?

35

Ich benutze immer entweder rsyncoder, scpum Dateien von / auf eine entfernte Maschine zu kopieren. Kürzlich habe ich im Handbuch von scp( man scp) die Flagge entdeckt-C

 -C      Compression enable.  Passes the -C flag to
         ssh(1) to enable compression.

Bevor ich diese Flagge entdeckte, pflegte ich zipvorher und dann scp.

Ist es genauso effizient, das -Cals Zippen und Entpacken zu verwenden? Wann wird mit dem einen oder anderen Verfahren die Übertragung beschleunigt?

Remi.b
quelle
2
Der beste Weg, denke ich, ist Benchmark von Ihnen. Mit scp -rvund scp -Crvden Durchsatz vergleichen.
Dienstag,
3
Dies ist für die Frage völlig irrelevant, aber es ziphandelt sich um ein sehr "Windows" -artiges Dateiformat. Sie werden es fast nie sehen oder brauchen, wenn Sie einen Linux-Rechner mit nativer Linux-Software betreiben. tarwird zum Aufrollen Verzeichnisse in eine Datei verwendet , während Berechtigungen und Namen und so die Erhaltung, während gzip, bzip2, xzusw. zu komprimieren Dateien verwendet werden. tars werden oft komprimiert, machen tar.gzund tar.xzgängige Formate für Archive unter Linux. Ich habe gesehen, wie Leute scpmit Befehlen wie " Roll" ihre eigene Arbeit machen tar cvz directory | ssh machine 'cd somewhere; tar xz'.
Score_Under
2
@Score_Under - Das zip-Format wird auch von Java zum Packen von .jar-Dateien verwendet, sodass zip auf vielen Linux-Servern immer noch häufig verwendet wird.
Johnny
Anstatt die Option bei jeder Dateiübertragung zu verwenden, können Sie Compression yesIhre .ssh/configDatei einfügen.
Barmar
Wenn Sie wirklich Geschwindigkeit wollen, können Sie SSH vermeiden: unix.stackexchange.com/questions/227951/…
rogerdpack

Antworten:

22

Es wird nie wirklich einen großen Unterschied machen, aber das Zippen der Datei vor dem Kopieren sollte ein wenig weniger effizient sein, da die Verwendung eines Containerformats zip, das mehrere Dateien (wie z. B.) kapseln kann, tarunnötig ist und das Streamen von ZIP nicht möglich ist Eingabe und Ausgabe (so benötigen Sie eine temporäre Datei).

Mit gzipauf der anderen Seite statt zipsollte genau das gleiche sein , da es ist , was ssh -Cunter der Haube tut ... außer dass Gzipping selbst ist mehr Arbeit als nur mit ssh -C.

Celada
quelle
Ok, ich werde nachsehen, was gzipist. Bedeutet Ihre Antwort, dass dies scp -rCwahrscheinlich die effizienteste Lösung ist, die ich habe?
Remi.b
1
In Ihrer Antwort wird nicht berücksichtigt, dass -Cein interaktiver Protokolldatenstrom komprimiert wird. Sie berücksichtigen nur die Daten. Ihre Schlussfolgerungen sind also falsch. Siehe meine Antwort
Martin Prikryl
@Celada Zip kann in eine Pipeline schreiben, da das Mitgliederverzeichnis am Ende steht. Wie Sie bereits sagten, muss beim Entpacken versucht werden, mehr als ein Element zu extrahieren, und daher kann nicht aus einer Pipeline gelesen werden.
jrw32982 unterstützt Monica
20

Das -CFlag ermöglicht eine gzip-Komprimierung eines SSH-Streams.

Es ist ein Äquivalent zu Accept-Encoding: gzipin HTTP.

Wie das Flag funktioniert, hängt von der Art der Daten ab, die Sie übertragen:

  • Beim Übertragen einer einzelnen großen Datei entspricht die Leistung in etwa dem Komprimieren der Datei vor der Übertragung (wobei die Effizienz des Algorithmus zip vs. gzip vernachlässigt wird).

    -CFür Sie als Benutzer bedeutet die Verwendung jedoch weniger Aufwand.

  • Wenn Sie viele kleine Dateien übertragen, ist die Leistung geringer als beim Zippen der Dateien vor der Übertragung.

    Ein Grund dafür ist, dass vor jeder Dateiübertragung eine interaktive Kommunikation zwischen dem SCP-Server und dem Client stattfindet (zum Austauschen von Dateimetadaten wie Zeitstempel und Berechtigungen). Daher müssen beide Seiten etwas warten, bis die andere Seite antwortet (Komprimierung hilft nicht beim Warten). Das ist eine Zeitverschwendung für jede übertragene Datei. Wie viel Zeit verschwendet wird, hängt von der Latenz der Verbindung ab. Am Ende kann die Übertragung um Größenordnungen langsamer sein.

    Wenn Sie eine einzelne komprimierte Datei übertragen, findet diese Kommunikation nur einmal statt.

Martin Prikryl
quelle
8

Es aktiviert die gzip-Komprimierung in ssh (unter dem scp).

Bei langsamen Verbindungen wird dies die Geschwindigkeit erhöhen. Bei relativ schnellen Verbindungen (100 MBit oder schneller) wird die Komprimierung die Geschwindigkeit sehr wahrscheinlich verringern.

Es ist mehr oder weniger effizient als zip, je nachdem, ob gzip (speziell gzip -6) mehr oder weniger effizient ist als die von Ihnen gewählte Komprimierungsstufe für zip

Wayne Walker
quelle
1
In meinem speziellen Fall habe ich eine relativ gute Verbindung (ich bin auf dem Campus), aber die Ordner, die ich kopieren muss, sind sehr groß (~ 100 GB über 442 .binund .txtDateien). Sie würden also vorschlagen, nur scp -rund keine -CFlagge zu verwenden und nein zip, gzipnicht tar?
Remi.b
2
@ Remi.b: Du musst es wohl in beide Richtungen benchmarken und sehen. Die Frage ist, ob die CPU schnell genug ist, um die Daten schneller zu komprimieren, als sie unkomprimiert über das Netzwerk gesendet werden könnten. Die Antwort hängt also von Ihrem Computer und Ihrem Netzwerk ab.
Nate Eldredge
Ok, ich habe den Punkt +1 bekommen. Vielen Dank für Ihre Hilfe
Remi.b
SSH selbst scheint etwas CPU zu beanspruchen, was ich bemerke. Manchmal wird die maximale Bandbreite weit unter Ihrer maximalen Bandbreite ausgenutzt. Nicht sicher, was Sie dort tun sollen ...
Rogerdpack
Die Leistung hängt auch von den Daten ab. Das Kopieren einer Datei, die im Wesentlichen aus Nullen besteht, wird stark komprimiert. Ich habe eine 500-MB-Verbindung zwischen zwei Remoteservern und habe gerade eine 50-GB-Datei (VMWare VMDK) kopiert, die alle Nullen über diese Verbindung bei ~ 128-130 MB / s enthält (wahrscheinlich einige SCP-Komprimierungspufferbegrenzung), was nur etwa 6-7 Minuten dauert. Ohne Komprimierung würde dies 1:45 Stunden dauern. Ihre Laufleistung hängt von der Komplexität der Daten ab und davon, wie gut sie komprimiert werden können.
Topher