W przypadku dużych plików najpierw kompresuj, a następnie przesyłaj lub rsync -z? który byłby najszybszy?


14

Mam mnóstwo małych plików danych względności, ale zajmują one około 50 GB i muszę je przenieść na inny komputer. Próbowałem wymyślić najbardziej skuteczny sposób, aby to zrobić.

Myślałem, że miałem zgzipować całą rzecz, potem zsynchronizować ją i zdekompresować, polegać na rsync -z do kompresji, gzip, a następnie użyć rsync -z. Nie jestem pewien, która opcja byłaby najbardziej wydajna, ponieważ nie jestem pewien, jak dokładnie została zaimplementowana rsync -z. Jakieś pomysły, która opcja byłaby najszybsza?

Odpowiedzi:


11

Nie możesz „gzipować całej rzeczy”, ponieważ gzip kompresuje tylko jeden plik, możesz utworzyć plik tar i gzipować go do „gzip całej rzeczy”, ale stracisz możliwość rsync kopiowania tylko zmodyfikowanego pliku.

Więc pytanie brzmi: czy lepiej jest przechowywać plik, muszę wykonać rsync gziped, czy polegać na opcji -z rsync.
Odpowiedź brzmi prawdopodobnie, że nie chcesz rozpakować pliku na swoim serwerze? Myślę, że tak, więc nie widzę, jak można zrobić plik gzip przed wykonaniem rsync.

Być może nie potrzebujesz funkcji rsync do kopiowania tylko zmodyfikowanego pliku? W takim przypadku dlaczego używać rsync zamiast robienia pliku SCP pliku tar.gz zawierającego twoje rzeczy?

W każdym razie, aby odpowiedzieć na pytanie, rsync gzip będzie nieco mniej wydajny niż plik gziping z gzip. Dlaczego ? ponieważ rsync będzie gzip porcjami danych po porcji, więc do utworzenia tabeli używanej przez gzip do kompresji użyty zostanie mniejszy zestaw danych, większy zestaw danych (gzip użyłby całego pliku naraz) daje lepszą tabelę kompresji. Ale różnica będzie w większości przypadków bardzo bardzo mała, ale w bardzo rzadkich przypadkach różnica może być ważniejsza (jeśli masz bardzo duży plik z bardzo długim powtarzaniem wiele razy w pliku, ale daleko od siebie) (To jest bardzo uproszczony przykład)


1
Z tego, jak przeczytałem jego pytanie, on skompresuje się, aby dostać go przez drut, a następnie rozpakuje drugą stronę. Wybrałbym natywną kompresję rsync nad gzip, po prostu dlatego, że kompresja i dekompresja 50 GB może zająć dużo czasu. Z drugiej strony, jeśli pliki są w większości tekstowe, ładnie się skompresują. Trzecia opcja: skopiuj pliki na dysk USB.

3
@Randolph Potter: tak, czas stracony na lokalną kompresję 50 GB, wtedy rsync byłby wyższy niż przy użyciu rsync -z, w każdym razie, jeśli chce skorzystać z samego rsync (kopiowanie tylko zmienionego pliku) kompresja nie może być wykonana wcześniej
promień

bardzo dobry punkt. +1 dla ciebie :-)

Przypomnij również, że gzip to kompresor strumieniowy.
Falcon Momot

6

Jeśli kopiujesz dane tylko raz, rsync sam w sobie nie będzie wielką wygraną. Jeśli lubisz gzip (lub tar + gzip, ponieważ masz wiele plików), możesz spróbować czegoś takiego:

tar -cz /home/me/source/directory | ssh target tar -xz --directory /home/you/target/directory

Spowoduje to uzyskanie poszukiwanej kompresji i po prostu skopiowanie bezpośrednio, bez udziału rsync.


prawdopodobnie użyłbym --lzop do tego zamiast gzip ... znacznie szybszego i niższego narzutu procesora i nadal ma dobre współczynniki kompresji tekstu
underrun

5

@radius, drobna nitka do wyboru o tym, jak gzipdziała - gzipjest algorytmem kompresji opartym na blokach i dość prostym. Cały plik nie jest uwzględniany w tabeli kompresji - tylko każdy blok. Inne algorytmy mogą wykorzystywać całą zawartość pliku, a niektóre wykorzystują zawartość wielu bloków lub nawet bloków o różnych rozmiarach. Jednym z fascynujących przykładów jestlrzip ten sam autor co rsync!

Chudy na gzipAlgorytm .

Podsumowując, użycie rsync -zprawdopodobnie da to samo kompresję jak gziping - a jeśli wykonujesz transfer różnicowy, lepiej ze względu na rsyncalgorytm różnicowania.

To powiedziawszy, myślę, że okaże się, że regularnie scpbije się ręczniersync dla transferów nieróżnicowych - ponieważ będą miały znacznie mniej narzutu niż rsyncalgorytm (który i tak użyłby scppod maską!)

Jeśli twoja sieć ma stać się wąskim gardłem, wtedy chcesz używać kompresji na drucie.

Jeśli twoje dyski są wąskim gardłem, najlepiej byłoby przesyłać strumieniowo do skompresowanego pliku. (na przykład,netcat z jednego komputera na drugi, przesyłanie strumieniowe do gzip -c)

Zwykle, jeśli kluczem jest szybkość, kompresowanie istniejącego pliku jest marnotrawstwem.

TIMTOWTDI, YMMV, IANAL itp.


2

Według tego faceta korzystanie z niego może być po prostu szybsze rsync -z, ale sądzę, że byłoby to tak wydajne jak kompresja każdego pliku przed przesłaniem. Powinno to być szybsze niż kompresowanie strumienia smoły, jak sugerują inni.

Ze strony podręcznika:

          Note  that  this  option  typically  achieves better compression
          ratios than can be achieved by using a compressing remote  shell
          or  a  compressing  transport  because it takes advantage of the
          implicit information in the matching data blocks  that  are  not
          explicitly sent over the connection.

1
Sugerowałbym użycie opcji --compress-level = 1 z rsync -z, jeśli masz szybką sieć. Chcesz, aby sieć była wąskim gardłem, a nie procesorem lub dyskiem IO, aby zminimalizować całkowity czas transferu. Jeśli sieć działa wolno, użycie domyślnego -z (myślę, że odpowiada gzip -6), może nadal wiązać sieć procesu.
rmalayter

1

Ponieważ zarówno scp skompresowanego pliku, jak i rsync zajmie bardzo podobny czas przesyłania, „najbardziej efektywnym sposobem na to” byłaby kompresja w locie zamiast kompresji, przesyłania.

Oprócz „szybkości” inne kwestie obejmują:

rsync można łatwo zrestartować, jeśli nie wszystkie pliki zostaną przeniesione.

rsync może być używany do utrzymywania plików na zdalnym komputerze.

lokalna tar lub gzip wymaga lokalnej przestrzeni.

Uwagi dotyczące użycia portu zarówno dla maszyny docelowej, jak i zapór ogniowych: 1) scp używa portu 22 (domyślnie), co może być nie do przyjęcia. 2) rsync users port 873 (domyślnie)

Nie jestem pewien, dlaczego promień oczekuje, że oryginalny plakat NIE chce przechowywać rozpakowanych plików.

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.