Co dokładnie flaga `-C` robi w` scp`?


35

Zawsze używam albo rsyncalbo scp, by skopiować plik z / na zdalny komputer. Ostatnio odkryłem w instrukcji scp( man scp) flagi-C

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

Zanim odkryłem tę flagę, kiedyś zipprzed i potem scp.

Czy tak samo efektywne jest używanie -Cniż rozpakowywanie i rozpakowywanie? Kiedy używasz jednego lub drugiego procesu, aby transfer był szybszy?


2
Myślę, że najlepszym sposobem jest samodzielny test. Używanie scp -rvi scp -Crvdo porównywania przepustowości.
cuonglm

3
Jest to całkowicie nieistotne dla pytania, ale zipjest to format pliku bardzo „Windows”. Prawie nigdy go nie zobaczysz ani nie będziesz potrzebował, gdy będziesz obsługiwał maszynę z systemem Linux z rodzimym oprogramowaniem. tarsłuży do zwijania katalogów w jednym pliku, przy zachowaniu uprawnień i nazwiska oraz takie, podczas gdy gzip, bzip2, xzitp są wykorzystywane do plików kompres. tars często są kompresowane, dzięki czemu tar.gzi tar.xzpopularnych formatów archiwów w systemie Linux. Widziałem, jak ludzie toczą własną scprobotę za pomocą takich poleceń tar cvz directory | ssh machine 'cd somewhere; tar xz'.
Score_Under

2
@Score_Under - Format zip jest także używany przez Javę do pakowania plików .jar, więc zip jest nadal szeroko stosowany na wielu serwerach Linux.
Johnny

Zamiast korzystać z opcji przy każdym przesyłaniu plików, możesz umieścić Compression yesswój .ssh/configplik.
Barmar

Jeśli naprawdę chcesz prędkości, możesz uniknąć SSH: unix.stackexchange.com/questions/227951/…
rogerdpack

Odpowiedzi:


22

Nigdy tak naprawdę nie zrobi to żadnej różnicy, ale skompresowanie pliku przed skopiowaniem powinno być nieco mniej wydajne, ponieważ użycie formatu kontenera, takiego jak zipktóry może zawierać wiele plików (jak tar), jest niepotrzebne i nie można przesyłać strumieniowo zip wejście i wyjście (więc potrzebujesz pliku tymczasowego).

gzipZ drugiej strony używanie zamiast zippowinno być dokładnie takie samo, ponieważ robi to ssh -Cpod maską ... poza tym, że gzipowanie się to więcej pracy niż zwykłe używanie ssh -C.


Ok, sprawdzę co gzipjest. Czy twoja odpowiedź oznacza, że scp -rCjest to prawdopodobnie najbardziej wydajne rozwiązanie, jakie mam?
Remi.b

1
Twoja odpowiedź nie uważa, że -Ckompresuje strumień interaktywnego protokołu. Uwzględniasz tylko dane. Więc twoje wnioski są błędne. Zobacz moją odpowiedź
Martin Prikryl

@Celada Zip może zapisywać w potoku, ponieważ katalog członków jest umieszczony na końcu. Jednak, jak powiedziałeś, rozpakowanie wymaga wyodrębnienia więcej niż jednego elementu, więc nie można odczytać z potoku.
jrw32982 obsługuje Monikę

20

-CFlaga umożliwia kompresję gzip w strumieniu SSH.

Jest to odpowiednik Accept-Encoding: gzipHTTP.

Sposób działania flagi zależy od rodzaju przesyłanych danych:

  • Podczas przesyłania pojedynczego dużego pliku wydajność byłaby prawie taka sama, jak skompresowanie pliku przed przesłaniem (pomijając efektywność algorytmu zip vs. gzip).

    Ale korzystanie z niego -Cjest mniejszym wysiłkiem dla Ciebie jako użytkownika.

  • Podczas przesyłania dużej liczby małych plików wydajność będzie gorsza niż w przypadku skompresowania plików przed przesłaniem.

    Powodem tego jest to, że przed każdym przesyłaniem plików istnieje interaktywna komunikacja między serwerem SCP a klientem (w celu wymiany metadanych plików, takich jak sygnatura czasowa i uprawnienia). Tak więc obie strony muszą trochę poczekać na odpowiedź drugiej strony (kompresja nie pomoże podczas oczekiwania). To zmarnowany czas na każdy przesłany plik. Ile czasu marnuje się, zależy od opóźnienia połączenia. Ostatecznie transfer może być wolniejszy.

    Po przesłaniu pojedynczego skompresowanego pliku komunikacja odbywa się tylko raz.


8

Umożliwia kompresję gzip w ssh (pod scp).

Przy powolnych połączeniach przyspieszy to, a przy każdym stosunkowo szybkim połączeniu (100 Mb lub szybszym) kompresja najprawdopodobniej spowolni.

Będzie mniej lub bardziej wydajny niż zip w zależności od tego, czy gzip (konkretnie gzip -6) byłby mniej lub bardziej wydajny niż wybrany poziom kompresji zip


1
W moim konkretnym przypadku mam stosunkowo dobre połączenie (jestem w kampusie), ale foldery, które muszę skopiować, są bardzo duże (~ 100 GB na 442 plików .bini .txtplików). Sugerowałbyś więc użycie scp -ri bez -Cflagi i nie zip, gzipnie tar?
Remi.b

2
@ Remi.b: Prawdopodobnie trzeba to przetestować na dwa sposoby i zobaczyć. Pytanie brzmi, czy procesor jest wystarczająco szybki, aby skompresować dane z większą szybkością, niż można by je przesłać przez sieć bez kompresji. Tak więc odpowiedź będzie zależeć od konkretnej maszyny i sieci.
Nate Eldredge

Ok mam punkt +1. Dzięki za pomoc
Remi.b

Wydaje mi się, że sam SSH wymaga trochę procesora, czasami maksymalizując go znacznie poniżej maksymalnej przepustowości. Nie jestem pewien, co tam zrobić ...
rogerdpack,

Wydajność zależy również od danych. Kopiowanie pliku, który zasadniczo składa się z samych zer, będzie wysoce skompresowane. Mam łącze 500 Mb między dwoma zdalnymi serwerami i właśnie skopiowałem plik 50G (VMWare VMDK) zawierający wszystkie zera tego łącza z prędkością ~ 128-130 MB / s (prawdopodobnie pewien limit bufora kompresji scp), zajmuje to tylko około 6-7 minut. Bez kompresji zajmie to 1:45 godzin. Twój przebieg będzie się różnić w zależności od złożoności danych i tego, jak dobrze można je skompresować.
Topher,
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.