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

Zwykle kompresuję używając tar zcvf i dekompresuję używając tar zxvf (używając gzip z powodu nawyku).

Ostatnio dostałem czterordzeniowy procesor z hyperthreading, więc mam 8 rdzeni logicznych i zauważyłem, że wiele rdzeni jest nieużywanych podczas kompresji/dekompresji.

Czy Jest jakiś sposób, aby wykorzystać nieużywane rdzenie, aby to przyspieszyć?

Author: BSMP, 2012-09-07

6 answers

Możesz użyć pigz zamiast gzip, który wykonuje kompresję gzip na wielu rdzeniach. Zamiast użyć opcji-z, przepuściłbyś 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 odpytywać. Możesz poprosić o więcej za pomocą-p n, np.-p 32. pigz ma te same opcje co gzip, więc możesz poprosić o lepszą kompresję z -9. Np.

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
 345
Author: Mark Adler,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-27 07:18:55

Możesz również użyć znacznika tar "--use-compress-program= " aby powiedzieć tar, jakiego programu kompresji użyć.

Na przykład użyj:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
 355
Author: Jen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-06-14 14:34:27

Wspólne podejście

Istnieje opcja dla tar Programu:

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

Możesz użyć wielowątkowej wersji archiver lub compressor utility.

Najpopularniejsze archiwizatory wielowątkowe to 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 Twoje narzędzie zastępcze nie ma tego parametru i / lub musisz podać dodatkowe parametry, użyj pipes (dodaj parametry, jeśli "required": {]}

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

Wejście i wyjście singlethread i multithread są kompatybilne. Możesz kompresować za pomocą wersji multithread i dekompresować za pomocą wersji singlethread i odwrotnie.

P7zip

Do kompresji p7zip potrzebny jest mały skrypt powłoki:

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

Zapisz 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 wielowątkowej obsługi XZ. Jeśli używasz wersji 5.2.0 lub wyższej XZ Utils, możesz użyć wielu rdzeni do kompresji, ustawiając -T lub --threads na odpowiednią wartość za pomocą zmiennej środowiskowej XZ_DEFAULTS (np. XZ_DEFAULTS="-T 0").

To jest fragment man dla wersji 5.1.0 alpha:

Wielowątkowa kompresja i dekompresja nie są jeszcze zaimplementowane, więc to opcja na razie nie działa.

Jednak nie będzie to działać przy dekompresji plików, które również nie skompresowano z włączonym wątkiem. Od człowieka dla wersji 5.2.2:

Dekompresja gwintowana nie została jeszcze zaimplementowana. To zadziała tylko na plikach zawierających wiele bloków z informacją o rozmiarze w blokuj nagłówki. Wszystkie pliki skompresowane w trybie wielowątkowym spełniają to warunek, ale Pliki skompresowane w trybie jednowątkowym nawet jeśli -- block-size = rozmiar jest używany.

Rekompilacja z zamiennikiem

Jeśli budujesz tar ze źródeł, to możesz przekompilować z parametry

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

Po przekompilowaniu tar z tymi opcjami możesz sprawdzić wyjście 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
 125
Author: Maxim Suslov,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-03-01 15:11:30

Możesz użyć skrótu -I dla przełącznika Tar --use-compress-program i wywołać pbzip2 dla kompresji bzip2 na wielu rdzeniach:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
 13
Author: panticz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-02-11 16:00:58

Jeśli chcesz mieć większą elastyczność z nazwami plików i opcjami 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 wyszukuje pliki, które chcesz zarchiwizować, w tym przypadku /my/path/*.sql i /my/path/*.log. Dodaj tyle -o -name "pattern" ile chcesz.

-exec wykona następne polecenie korzystając z wyników find: tar

Krok 2: tar

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

--transform jest prostym parametrem zastępującym ciąg znaków. Rozbiera ścieżka plików z archiwum tak, aby główny katalog tarballa stał się bieżącym katalogiem podczas rozpakowywania. Zauważ, że nie możesz użyć opcji -C do zmiany katalogu, ponieważ stracisz korzyści z find: wszystkie pliki katalogu zostaną uwzględnione.

-P mówi tar, aby używała ścieżek bezwzględnych, więc nie uruchamia Ostrzeżenia "usuwanie wiodącego' / 'z nazw członków". Początek ' / ' z be removed by --transform anyway.

-cf - mówi tar aby użyć nazwy tarballa podamy później

{} + używa wszystkich plików, które find znaleziono wcześniej

Krok 3: pigz

pigz -9 -p 4

Używaj tylu parametrów, ile chcesz. W tym przypadku -9 jest poziomem kompresji, a {[24] } jest liczbą rdzeni przeznaczonych do kompresji. Jeśli uruchamiasz to na mocno załadowanym serwerze internetowym, prawdopodobnie nie chcesz używać wszystkich dostępnych rdzeni.

Krok 4: nazwa archiwum

> myarchive.tar.gz

W końcu.
 1
Author: Bloops,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-07-23 16:28:35

Stosunkowo nowszym narzędziem do kompresji (de), które warto rozważyć, jest zstandard. Wykonuje doskonałą pracę z wykorzystaniem zapasowych rdzeni i ma kilka świetnych kompromisów, jeśli chodzi o współczynnik kompresji vs. (de)czas kompresji. Jest również wysoce konfigurowalny w zależności od potrzeb współczynnika kompresji.

 1
Author: pgebhard,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-04-06 04:09:30