Wykorzystanie wielu rdzeni do kompresji / dekompresji tar + gzip / bzip

225

Zwykle kompresuję za pomocą tar zcvfi dekompresuję za pomocą tar zxvf(używając gzip z powodu nawyku).

Niedawno dostałem czterordzeniowy procesor z hyperthreading, więc mam 8 rdzeni logicznych i zauważam, że wiele rdzeni nie jest używanych podczas kompresji / dekompresji.

Czy jest jakiś sposób na wykorzystanie nieużywanych rdzeni, aby przyspieszyć?

użytkownik1118764
źródło
Rozwiązanie zaproponowane przez Xionga Chiamiova powyżej działa pięknie. Właśnie utworzyłem kopię zapasową mojego laptopa za pomocą .tar.bz2 i zajęło 132 minuty przy użyciu tylko jednego wątku procesora. Następnie skompilowałem i zainstalowałem tar ze źródła: gnu.org/software/tar Dołączyłem opcje wymienione w kroku konfiguracji: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Uruchomiłem kopię zapasową ponownie i zajęło to tylko 32 minuty. To lepsze niż 4-krotne ulepszenie! Obserwowałem monitor systemu i cały czas utrzymywał wszystkie 4 procesory (8 wątków) na płasko na poziomie 100%. TO jest najlepsze rozwiązanie.
Warren Severin,

Odpowiedzi:

309

Możesz użyć pigz zamiast gzip, który kompresuje gzip na wielu rdzeniach. Zamiast używać opcji -z, przepuszczasz ją przez pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

Domyślnie pigz używa liczby dostępnych rdzeni lub ośmiu, jeśli nie może tego zapytać. Możesz poprosić o więcej za pomocą -pn, np. -P 32. pigz ma te same opcje co gzip, więc możesz zażądać lepszej kompresji za pomocą -9. Na przykład

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Mark Adler
źródło
3
Jak używasz Pigz do dekompresji w ten sam sposób? Czy może działa tylko w przypadku kompresji?
user788171,
42
pigz używa wielu rdzeni do dekompresji, ale tylko z ograniczoną poprawą w stosunku do jednego rdzenia. Format deflacji nie nadaje się do równoległej dekompresji. Część dekompresyjną należy wykonać szeregowo. Pozostałe rdzenie do dekompresji Pigza służą do odczytu, zapisu i obliczania CRC. Podczas kompresji z drugiej strony, pigz zbliża się do współczynnik n poprawy z n rdzeni.
Mark Adler
7
Łącznik jest tutaj stdout (zobacz tę stronę ).
Garrett
3
Tak. W 100% kompatybilny w obu kierunkach.
Mark Adler
4
W rzeczywistości nie ma czasu procesora spędzanego na tarowaniu, więc to niewiele by pomogło. Format tar jest tylko kopią pliku wejściowego z blokami nagłówków między plikami.
Mark Adler,
324

Możesz także użyć flagi tar "--use-compress-program =", aby powiedzieć tarowi, jakiego programu do kompresji użyć.

Na przykład użyj:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
Jen
źródło
21
To niesamowity mały samorodek wiedzy i zasługuje na więcej pochwał. Nie miałem pojęcia, że ​​ta opcja w ogóle istnieje, i czytałem stronę podręcznika kilka razy przez lata.
Randall Hunt
2
@ValerioSchiavoni: Nie tutaj, mam pełne obciążenie wszystkich 4 rdzeni (Ubuntu 15.04 „Vivid”).
bovender
8
Wolę tar - dir_to_zip | pv | pigz > tar.filepv pomaga mi oszacować, możesz to pominąć. Ale nadal łatwiej jest pisać i pamiętać.
Offenso,
@ NathanS.Watson-Haigh Tak. Wystarczy zawrzeć nazwę programu i argumenty w cudzysłowie. man tartak mówi, podobnie jak to .
Marc.2377
1
W 2020 r. zstdJest najszybszym narzędziem do tego. Zauważalne przyspieszenie podczas kompresji i dekompresji. Służy tar -cf --use-compress-program=zstdmtdo tego w przypadku wielowątkowości.
jadelord
112

Wspólne podejście

Istnieje opcja dla tarprogramu:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Możesz użyć wielowątkowej wersji narzędzia archiwizującego lub kompresora.

Najpopularniejszymi wielowątkowymi archiwizatorami są pigz (zamiast gzip) i pbzip2 (zamiast bzip2). Na przykład:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Archiver musi zaakceptować -d. Jeśli narzędzie zastępcze nie ma tego parametru i / lub musisz określić dodatkowe parametry, użyj rur (w razie potrzeby dodaj parametry):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

Wejścia i wyjścia jedno- i wielowątkowe są kompatybilne. Możesz kompresować za pomocą wersji wielowątkowej i dekompresować za pomocą wersji jedno-wątkowej i odwrotnie.

p7zip

Do kompresji p7zip potrzebny jest mały skrypt powłoki, taki jak poniżej:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

Zapisz go jako 7zhelper.sh. Oto przykład użycia:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

Odnośnie obsługi wielowątkowej XZ. Jeśli używasz wersji 5.2.0 lub wyższej XZ Utils, można wykorzystać wiele rdzeni do kompresji przez ustawienie -Tlub --threadsdo odpowiedniej wartości za pośrednictwem XZ_DEFAULTS zmiennych środowiskowych (np XZ_DEFAULTS="-T 0").

To jest fragment człowieka dla wersji 5.1.0alfa:

Kompresja i dekompresja wielowątkowa nie są jeszcze zaimplementowane, więc na razie ta opcja nie działa.

Nie będzie to jednak działać w przypadku dekompresji plików, które również nie zostały skompresowane z włączonym wątkiem. Od mana dla wersji 5.2.2:

Gwintowana dekompresja nie została jeszcze zaimplementowana. Działa tylko w przypadku plików zawierających wiele bloków z informacjami o rozmiarze w nagłówkach bloków. Wszystkie pliki skompresowane w trybie wielowątkowym spełniają ten warunek, ale pliki skompresowane w trybie jednowątkowym nawet nie są używane, jeśli użyto opcji --block-size = size.

Ponowna kompilacja z wymianą

Jeśli budujesz tar ze źródeł, możesz ponownie skompilować z parametrami

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Po ponownej kompilacji tar za pomocą tych opcji możesz sprawdzić dane wyjściowe pomocy tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz
Maxim Susłow
źródło
1
To jest rzeczywiście najlepsza odpowiedź. Na pewno odbuduję moją smołę!
1
Właśnie znalazłem pbzip2 i mpibzip2 . mpibzip2 wygląda bardzo obiecująco dla klastrów lub na przykład w przypadku laptopa i wielordzeniowego komputera stacjonarnego.
To świetna i wyszukana odpowiedź. Warto wspomnieć, że kompresja wielowątkowa (np. Z pigz) jest włączona tylko wtedy, gdy czyta z pliku. Przetwarzanie STDIN może faktycznie być wolniejsze.
oᴉɹǝɥɔ
3
Plus 1 za xzopcję. To najprostsze, ale skuteczne podejście.
selurvedu
2
export XZ_DEFAULTS="-T 0"przed wywołaniem tarz opcją -Jkompresji xz działa jak urok.
scai
13

Możesz użyć skrótu -Ido --use-compress-programprzełącznika tar i wywołać pbzip2kompresję bzip2 na wielu rdzeniach:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
panticz
źródło
Miłym TL; DR dla @ MaximSuslov za odpowiedź .
einpoklum
Zwraca tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash
1

Jeśli chcesz mieć większą elastyczność dzięki nazwom plików i opcjom kompresji, możesz użyć:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Krok 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

To polecenie wyszuka pliki, które chcesz zarchiwizować, w tym przypadku /my/path/*.sqli /my/path/*.log. Dodaj tyle, -o -name "pattern"ile chcesz.

-execwykona następne polecenie, używając wyników find:tar

Krok 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformjest prostym parametrem zastępującym ciąg znaków. Spowoduje to usunięcie ścieżki plików z archiwum, dzięki czemu katalog główny tarballa stanie się bieżącym katalogiem podczas rozpakowywania. Pamiętaj, że nie możesz użyć -Copcji zmiany katalogu, ponieważ stracisz korzyści find: wszystkie pliki katalogu zostaną dołączone.

-Pkaże tarużywać ścieżek bezwzględnych, więc nie wywołuje ostrzeżenia „Usuwanie wiodącego` / 'z nazw członków ”. Wiodące „/” należy usunąć --transformmimo to.

-cf -mówi, taraby użyć nazwy tarball, którą określimy później

{} +używa wszystkich findznalezionych wcześniej plików

Krok 3: pigz

pigz -9 -p 4

Używaj tyle parametrów, ile chcesz. W tym przypadku -9jest to poziom kompresji i -p 4liczba rdzeni dedykowanych do kompresji. Jeśli uruchomisz to na mocno obciążonym serwerze internetowym, prawdopodobnie nie chcesz używać wszystkich dostępnych rdzeni.

Krok 4: zarchiwizuj nazwę

> myarchive.tar.gz

Wreszcie.

Bloops
źródło
0

Stosunkowo nowsze narzędzie do kompresji (de), które warto rozważyć, to standard . Doskonale radzi sobie z wykorzystaniem zapasowych rdzeni i dokonał wielkich kompromisów, jeśli chodzi o stosunek kompresji do czasu (de) kompresji. Jest również wysoce precyzyjny w zależności od potrzeb w zakresie kompresji.

pgebhard
źródło