Jaki jest najlepszy sposób domyślnego używania równoległego bzip2 i gzip?

41

Bzip2 i gzip używają tylko jednego rdzenia, chociaż wiele komputerów ma więcej niż jeden rdzeń. Są jednak programy takie jak lbzip2, pbzip2 i pigz, które używają wszystkich dostępnych rdzeni i obiecują być kompatybilne z bzip2 i gzip.

Więc jaki jest najlepszy sposób domyślnego korzystania z tych programów, aby tar cfa file.tar.bz2 directoryużywał lbzip2 / pbzip2 zamiast bzip2? Oczywiście, że nie chcę niczego łamać.

Elmicha
źródło
2
Z ciekawości dla wszystkich: Czy równoległy gzip / bzip jest naprawdę szybszy niż serial? Wyobrażam sobie, że szybkość zapisu na dysku twardym i inne ograniczenia są większym problemem.
con-f-use
@ con-f-use Nie, chyba że teoretycznie masz dyski SSD, może to być szybsze wraz ze wzrostem całkowitego rozmiaru archiwum.
Marco Ceppi
1
W systemie z 16 procesorami, przejście z gzip na pigz skróciło czas do tarowania 1.2 TB i przesłano go przez sieć i przetestowano wynik z 18 godzin kopii zapasowej i 14 godzin testu do 4 godzin kopii zapasowej i 2 godzin testu. Istnieje wiele potencjalnych wąskich gardeł, szybkość dysku, prędkość sieci, moc przetwarzania, jednak w tym przypadku było to zdecydowanie związane z procesorem bardziej niż z IO. Jest to wysokiej klasy system, Twoje wyniki mogą się różnić. Nie ma to znaczenia, ale miało to miejsce na RHEL6
cs_alumnus

Odpowiedzi:

32

Możesz symlinkować bzip2, bunzip2 i bzcat do lbzip2, a gzip, gunzip, gzcat i zcat do pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

Wybrałem lbzip2 zamiast pbzip2, ponieważ /usr/share/doc/lbzip2/README.gz wygląda „ładniej” niż /usr/share/doc/pbzip2/README.gz. Również instrukcja tar mówi o lbzip2 .

Edytować:

pigz-2.1.6, który jest zawarty w Precise Pangolin, odmawia dekompresji plików z nieznanymi przyrostkami (np. initramfs - *. img). Zostało to naprawione w pigz-2.2.4, który jest dostarczany z Quantal. Możesz więc poczekać, aż Quantal, ręcznie zainstalować pakiet Quantal lub jeszcze nie linkować gunzip / gzcat / zcat.

Elmicha
źródło
7
Działa to dobrze, ponieważ / usr / local / bin / występuje przed / bin / w $ PATH większości ludzi. Jeśli coś wywołuje / bin / gunzip bezpośrednio lub ktoś ma / bin jako pierwszy w swojej zmiennej $ PATH, nie użyje pigz. Aby to działało również dla nich, możesz użyć dpk-divert i zrobić coś takiego dla wszystkich plików binarnych, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipale istnieje możliwość, że pigz nie jest w 100% kompatybilny ze wszystkimi flagami gzip, więc bądź ostrożny.
Mark McKinstry
31

Idea dowiązania symbolicznego jest naprawdę w porządku.
Innym działającym rozwiązaniem jest alias tar:

alias tar='tar --use-compress-program=pbzip2'

lub odpowiednio

alias tar='tar --use-compress-program=pigz'

Tworzy inny rodzaj domyślnych.

Bastian Ebeling
źródło
dodatkowa korzyść: możesz użyć aliasu typu „partar”, jeśli chcesz zachować oryginalną funkcjonalność (z jakiegoś powodu) .. niestety „ptar” jest pobierany przez implementację perla
jena
13

Odpowiedź dowiązania symbolicznego jest naprawdę niepoprawna. Zastąpiłby domyślny gzip (lub bzip2) na pigz (lub pbzip2) dla całego systemu. Podczas gdy równoległe implementacje są niezwykle podobne do wersji z pojedynczym procesem, subtelne różnice w opcjach wiersza poleceń mogą złamać podstawowe procesy systemowe, które zależą od tych różnic.

Opcja „--use-compress-program” jest znacznie lepszym wyborem. Drugą opcją (podobnie jak alias) byłoby ustawienie zmiennej środowiskowej TAR_OPTIONS obsługiwanej przez GNU tar:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
użytkownik154053
źródło
6
Używam dowiązań symbolicznych od 2011 roku i nie widziałem żadnego zerwania (poza przypadkiem wspomnianym w edycji). A jeśli takie subtelne różnice nie zostaną znalezione i zgłoszone, na zawsze utkniemy w nierównoległych wersjach. Jeśli użyjesz TAR_OPTIONS = "- use-compress-program = pbzip2", nie wydaje się, abyś mógł odróżnić bzip2 od gzip.
elmicha
To mi nie zadziałało.
Derek Perkins,
3

Jedną z fascynujących opcji jest ponowna kompilacja tar, aby domyślnie używać wielowątkowości. Skopiowano z tej odpowiedzi przepełnienia stosu

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
Tom Koch
źródło
-2

Użyj w ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
bar foo
źródło
1
Działa to tylko podczas wywoływania programu gzip(lub gunzip) bezpośrednio z wiersza poleceń powłoki. tarNie wpłynie to na inne programy (takie jak ).
Christian Hudon