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


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.


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.


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 /

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

-2

Użyj w ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"

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
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.