pbzip2 – bzip2 na kilku rdzeniach

bzip2 doskonale znane wszystkim polecenie. Dzięki niemu możemy zaosczędzić wiele miejsca na dysku, pakując wybrane pliki. Bardzo dobra kompresja wymaga niestety sporo czasu, a co najgorsze polecenie potrafi korzystać tylko z jednego rdzenia. Na szczęście istnieje jego ulepszona wersja, która radzi sobie doskonale z dzisiejszymi wielordzeniowymi procesorami. Warto więc zmienić stare nawyki i zainstalować pbzip2 (Parallel BZIP2), bo dzięki niemu można zyskać sporo cennego czasu. Poniżej krótkie porównanie szybkości między bzip2 i pbzip2.

Instalacja pbzip2

Zaczynamy oczywiście od instalacji pakietu pbzip2. W systemie CentOS (Fedora, Red Hat), musimy dodać repozytorium epel:

[root@localhost tmp]# rpm -Uvh http://download.fedoraproject.org/pub/epel/6/i386/epel-release-6-7.noarch.rpm
warning: epel-release-6-7.noarch.rpm: Header V3 RSA/SHA256 Signature, key ID 0608b895: NOKEY
Preparing...                ########################################### [100%]
   1:epel-release           ########################################### [100%]
[root@localhost tmp]# yum install pbzip2

Użytkownicy Arch Linux wpisują:

[root@arch tmp]# pacman -S pbzip2

Testy

Testy wykonamy na pliku ISO (222MB), komputer wyposażony w procesor AMD Athlon(tm) II X4 640 Processor (4 rdzenie)

bzip2 szybkość kompresji oraz dekompresji

[root@localhost test]# ls -lh install51.iso
-rw-r--r-- 1 root root 222M Jul 27 15:41 install51.iso
[root@localhost test]# time bzip2 -k -c install51.iso > install51.iso-bzip2.bz2
real    1m11.773s
user    1m10.822s
sys     0m0.368s
[root@localhost test]# time bunzip2 -c install51.iso-bzip2.bz2 > install51.iso-bzip2
real    0m30.497s
user    0m29.125s
sys     0m0.442s

pbzip2 szybkość kompresji oraz dekompresji

[root@localhost test]# time pbzip2 -k -c install51.iso > install51.iso-pbzip2.bz2
real    0m36.035s
user    1m15.943s
sys     0m1.284s
[root@localhost test]# time pbunzip2 -c install51.iso-pbzip2.bz2 > install51.iso-pbzip2
real    0m13.581s
user    0m29.163s
sys     0m0.860s
[root@localhost test]# top
  PID USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
19589 root      20   0  349m  40m  964 S 220.1  0.5   0:33.05 pbzip2

Sumy md5 rozpakowanych plików i oraz oryginału zgadzają się idealnie:

[root@localhost test]# md5sum install51.iso* | grep -v bz2
8943a5f885bc2e452962d32bfec2ebd4  install51.iso
8943a5f885bc2e452962d32bfec2ebd4  install51.iso-bzip2
8943a5f885bc2e452962d32bfec2ebd4  install51.iso-pbzip2

Jak widać powyżej pbzip2 okazał się 2 krotnie szybszy podczas operacji pakowania (36s vs 71s) oraz prawie 3x szybszy przy dekompresji (13.5s vs 30.5s). Co najważniejsze pliki utworzone przez pbzip2 i bzip2 są ze sobą w 100% kompatybilne (jest to dokładnie ten sam format), więc bez problemu rozpakujemy plik utworzony w pbzip2 używając polecenia bzip2.
Warto jeszcze wspomnieć, że sami możemy zdecydować ilu procesorów (rdzeni) chcemy użyć podczas kompresji/dekompresji. Służy do tego opcja -p (przykładowo pbzip2 -p4 dla 4 rdzeni).

pbzip2 razem z tar

Tworząc archiwum tar.bz2, polecenie tar używa tylko jednego procesora (rdzenia). Możemy wspomóc się poleceniem pbzip2 w prosty sposób, używając opcji –use-compress-program=PROG. Poniżej porównanie czasu kompresji w przypadku katalogu (129MB, 8048 plików):

[root@localhost test]# time tar -cf dir.tar.bz2 --use-compress-prog=pbzip2 dir/
real    0m18.324s
user    0m38.099s
sys     0m0.696s
[root@localhost test]# time tar -jcf dir.tar.bz2 dir/
real    0m43.440s
user    0m43.156s
sys     0m0.501s

pbzip2 znów ponad 2x szybszy (18.3s w porównaniu do 43.4s dla bzip2)

Porównanie wydajności pbzip2 z bzip2 – wyniki

W poniższej tabeli przedstawiamy więcej wyników dla różnych procesorów. Każdy test był przeprowadzony 3 razy (obraz ISO systemu OpenBSD 5.1, 222MB), w tabeli znajduje się uśredniona wartość.

Procesor bzip2 pbzip2 bunzip2 pbunzip2
AMD X4 640 @3.0GHz
(4 rdzenie)
71.7s 36s
+200%
30.6s 13.5s
+230%
Opteron 4428HE @2.8GHz
(6 rdzeni)
48.5s 12.7s
+380%
18.5s 4.7s
+390%
i7-2600K @3.4GHz
(4 rdzenie + HT)
29s 7.8s
+370%
11.8s 3.6s
+330%
2x Xeon E5420 @2.5GHz
(2x 4 rdzenie)
54s 8s
+675%
20.5s 3.3s
+620%
i7-4790k @4.0GHz
(4 rdzenie + HT)
22.2s 6.6s
+335%
11s 3.1s
+355%

Zostaw komentarz


Podpowiedź - możesz użyć tych HTML tagów i atrybutów:
<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

Obraz CAPTCHY

*