Dlaczego formaty archiwów tar przełączają się na kompresję xz, aby zastąpić bzip2, a co z gzip?

202

Coraz więcej tararchiwów używa xzdo kompresji formatu opartego na LZMA2 zamiast tradycyjnej bzip2(bz2). W rzeczywistości kernel.org opublikował późne ogłoszenie „ Good-bye bzip2, 27 grudnia 2013 r. , Wskazując, że źródła jądra będą od tego momentu wydawane zarówno w formacie tar.gz, jak i tar.xz - oraz na stronie głównej witryny co jest bezpośrednio oferowane jest w tar.xz.

Czy istnieją jakieś konkretne powody wyjaśniające, dlaczego tak się dzieje i jakie jest znaczenie gzipw tym kontekście?


źródło

Odpowiedzi:

198

W przypadku dystrybucji archiwów przez Internet na ogół priorytetem są następujące rzeczy:

  1. Współczynnik kompresji (tj. Jak mały kompresor tworzy dane);
  2. Czas dekompresji (wymagania dotyczące procesora);
  3. Wymagania dotyczące pamięci dekompresyjnej; i
  4. Kompatybilność (jak szeroki jest program dekompresyjny)

Wymagania dotyczące pamięci kompresyjnej i procesora nie są bardzo ważne, ponieważ możesz do tego użyć dużej, szybkiej maszyny i musisz to zrobić tylko raz.

W porównaniu do bzip2, xz ma lepszy współczynnik kompresji i krótszy (lepszy) czas dekompresji. Jednak przy zwykle używanych ustawieniach kompresji wymaga więcej pamięci do dekompresji [1] i jest nieco mniej rozpowszechniony. Gzip zużywa mniej pamięci niż oba.

Publikowane są archiwa w formacie gzip i xz, co pozwala wybrać:

  • Potrzebujesz rozpakować na komputerze z bardzo ograniczoną pamięcią (<32 MB): gzip. Biorąc pod uwagę, mało prawdopodobne, gdy mówimy o źródłach jądra.
  • Potrzebujesz zdekompresować minimalne dostępne narzędzia: gzip
  • Chcesz zaoszczędzić czas pobierania i / lub przepustowość: xz

Tak naprawdę nie ma realistycznej kombinacji czynników, które skłoniłyby cię do wybrania bzip2. Więc jest stopniowo wycofywany.

Przejrzałem porównania kompresji w poście na blogu . Nie próbowałem powielać wyników i podejrzewam, że niektóre z nich uległy zmianie (głównie spodziewam xzsię poprawy, ponieważ jest to najnowsza wersja).

(Istnieją pewne konkretne scenariusze, w których dobra implementacja bzip2 może być lepsza niż xz: bzip2 może kompresować plik z dużą ilością zer i sekwencji DNA genomu lepiej niż xz. Nowsze wersje xz mają teraz (opcjonalny) tryb blokowania, który umożliwia odzyskiwanie danych po punkcie uszkodzenia i kompresji równoległej i [teoretycznie] dekompresji. Wcześniej tylko bzip2 je oferował. [2] Jednak żaden z nich nie jest istotny dla dystrybucji jądra)


1: W rozmiarze archiwum xz -3jest około bzip -9. Następnie xz zużywa mniej pamięci do dekompresji. Ale xz -9(jak np. Używany w tarballach jądra Linuksa) używa znacznie więcej niż bzip -9. (A nawet xz -0potrzebuje więcej niż gzip -9).

2: F21 System Wide Change: lbzip2 jako domyślna implementacja bzip2

derobert
źródło
Jakiś komentarz na temat tolerancji na uszkodzenia czy jest to coś, co zawsze jest wdrażane całkowicie poza algorytmami kompresji?
1
Nie można zapewnić odporności @ illuminÉ bez poświęcenia współczynnika kompresji. Jest to problem ortogonalny i chociaż istnieją narzędzia takie jak Parchive, do dystrybucji jądra obsługa błędów TCP dobrze sobie radzi.
Tobu
2
@ illuminé Tolerancja błędów (zakładając, że masz na myśli coś podobnego do par2) zwykle nie stanowi problemu przy dystrybucji archiwów przez Internet. Pliki do pobrania są uważane za wystarczająco niezawodne (i można je ponownie pobrać, jeśli zostało uszkodzone). Często używane są kryptograficzne skróty i podpisy, które wykrywają zarówno uszkodzenia, jak i manipulacje. Istnieją sprężarki, które zapewniają większą odporność na uszkodzenia, jednak kosztem stopnia sprężania. Wydaje się, że nikt nie uznaje kompromisów za pobieranie HTTP lub FTP.
derobert
xz używa MNIEJ pamięci do dekompresji.
MichalH
@ Mike Czy zmieniło się odkąd to napisałem? W szczególności przypis 1 wyjaśnia zużycie pamięci.
derobert
45

Przede wszystkim pytanie to nie jest bezpośrednio związane tar. Tar po prostu tworzy nieskompresowane archiwum, a następnie kompresja jest stosowana.

Gzip jest znany jako stosunkowo szybki w porównaniu do LZMA2 i bzip2. Jeśli prędkość ma znaczenie, gzip(szczególnie implementacja wielowątkowa pigz) jest często dobrym kompromisem między prędkością kompresji a współczynnikiem kompresji. Chociaż istnieją alternatywy, jeśli problemem jest prędkość (np. LZ4).

Jeśli jednak pożądany jest wysoki stopień kompresji, LZMA2 bije bzip2prawie w każdym aspekcie. Szybkość kompresji jest często wolniejsza, ale dekompresuje się znacznie szybciej i zapewnia znacznie lepszy współczynnik kompresji kosztem wyższego zużycia pamięci.

Nie ma już większego powodu, aby z niego korzystać bzip2, poza kompatybilnością wsteczną. Ponadto LZMA2 został zaprojektowany z myślą o wielowątkowości, a wiele implementacji domyślnie korzysta z procesorów wielordzeniowych (niestety xzna Linuksie jeszcze tego nie robi). Ma to sens, ponieważ prędkości zegara już nie wzrosną, ale liczba rdzeni wzrośnie.

Istnieją bzip2implementacje wielowątkowe (np. pbzip), Ale często nie są domyślnie instalowane. Zauważ również, że wielowątkowość bzip2naprawdę się opłaca podczas kompresji, podczas gdy dekompresja używa jednego wątku, jeśli plik był kompresowany przy użyciu jednego wątku bzip2, w przeciwieństwie do LZMA2. bzip2Warianty równoległe mogą wykorzystywać procesory wielordzeniowe tylko wtedy, gdy plik został skompresowany przy użyciu bzip2wersji równoległej , co często nie ma miejsca.

Marco
źródło
4
Cóż, niektóre smoły grokują zopcję.
tchrist
„prędkość” powoduje mętną odpowiedź, powinieneś odnosić się do prędkości kompresji lub prędkości dekompresji. Ani pixz, pbzip2 ani pigz nie są instalowane domyślnie (lub używane przez tar bez flagi -I), ale pixz i pbzip2 przyspieszają kompresję i dekompresję, a pigz służy tylko do kompresji.
Tobu
@Tobu xzbędzie domyślnie wielowątkowe, więc pixzw przyszłości nie będzie wymagana instalacja. Na niektórych platformach xzwątki są już obsługiwane. Natomiast bzip2nigdy nie będzie wielowątkowości, ponieważ format nie został zaprojektowany z myślą o wielowątkowości. Co więcej, pbzip2przyspiesza dekompresję tylko wtedy, gdy plik został skompresowany przy użyciu, pbzip2co często nie jest prawdą.
Marco
1
@Marco Wierzę, że lbzip2 pozwala na równoległą dekompresję plików, nawet jeśli zostały one skompresowane za pomocą implementacji nierównoległej (np. Stock bzip2). Dlatego używam lbzip2 zamiast pbzip2. (Możliwe, że ewoluowało to od czasu twojego komentarza.)
RaveTheTadpole
19

Krótka odpowiedź : xz jest bardziej wydajny pod względem współczynnika kompresji. Oszczędza to miejsce na dysku i optymalizuje transfer przez sieć.
Możesz zobaczyć ten Szybki Benchmark , aby odkryć różnicę poprzez testy praktyczne.

Slyx
źródło
Link jest zepsuty.
flarn2006
18

LZMA2 to system kompresji bloków, podczas gdy gzip nie. Oznacza to, że LZMA2 nadaje się do wielowątkowości. Ponadto, jeśli uszkodzenie wystąpi w archiwum, ogólnie można odzyskać dane z kolejnych bloków za pomocą LZMA2, ale nie można tego zrobić za pomocą gzip. W praktyce tracisz całe archiwum za pomocą gzip po uszkodzonym bloku. Dzięki archiwum LZMA2 tracisz tylko plik (i), na które wpływ mają uszkodzone bloki. Może to być ważne w większych archiwach z wieloma plikami.

Mark Warburton
źródło
2
To rzeczywiście bardzo przydatne i ważne rozróżnienie!
leden