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ć?
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
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
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
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/
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
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.
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