Hogyan tömöríthetünk be fájlokat sokkal gyorsabban, a pigz program segítségével

botond küldte be 2019. 02. 14., cs – 08:08 időpontban

Tartalom

 

Bevezető

Ha gyakran tömörítünk fájlokat, könyvtárakat, akkor fontos lehet a tömörítés sebessége is. Az elterjedtebb tömörítő programok sajnos csak egy szálon dolgoznak, így nem tudják kihasználni a mai modern, többmagos processzorokat. Ebben a leírásban megismerhetjük a pigz programot, amellyel több szálon futtathatjuk a tömörítési folyamatot, ezáltal kihasználhatjuk az összes processzormagot.

 

 

A pigz tömörítőprogram

A pigz (parallel implementation of gzip) egy párhuzamos fejlesztése a gzip-nek, ami teljes mértékben helyettesíteni tudja azt, annyi extrával, hogy minden processzormagon indít egy szálat, így jóval nagyobb sebességgel képes betömöríteni a fájlokat, könyvtárakat.

Telepítése

A program forráskódja letölthető a készítő oldaláról, de szerencsére a Debian csomagtárában is megtalálható, így telepíthető a szokásos módon:

apt-get install pigz

A pigz parancs kapcsolói tartalmazzák a gzip kapcsolóit is, így használata a gzip-nél megszokott módon történik.

Tömörítés

Fájl tömörítése/becsomagolása a legegyszerűbb példával:

pigz <fájlnév>

A parancs ugyanúgy működik, mint a gzip, alapesetben eltávolítja a forrásfájlt.

Másik példa, néhány kapcsolóval:

pigz -kv11f <fájl>

A kapcsolók itt a következők:

  • k: keep - megtartja a forrásfájlt (ugyanúgy, mint a gzipben)
  • v: bőbeszédű mód. Ez is ugyanúgy működik.
  • 11: Maximális tömörítés. A gzipnél csak 1-9-ig lehet állítani a tömörítés mértékét, itt van még egy 11-es szint is külön.
  • f: force mód: Felülírja a kimeneti fájlt, ha az már létezik. A kapcsoló nélkül ilyenkor rákérdez.

A tömörítés már alapértelmezetten is több szálon megy. Ha nem rendelkezünk másképp, akkor a program az érzékelt processzormagok számának megfelelő mennyiségű szálon indítja el a tömörítést. De ha kevesebb szálon szeretnénk futtatni a csomagolást, akkor ezt is megadhatjuk neki:

pigz -p <x> <fájlnév>

Ahol az x érték jelöli az indítani kívánt folyamatok mennyiségét.

És még egy példa egy alkönyvtár rekurzív becsomagolására:

pigz -r <alkönyvtár>

Kicsomagolás

A kicsomagolás is ugyanúgy történik, mint a gzip esetében:

pigz -d <archív fájl>

 

Tesztek

Ebben a részben elvégzünk pár időmérést, összehasonlítva a gzip programmal.

Próbafájl létrehozása

Létrehozunk egy teszt fájlt, majd ezeken végezzük el a sebesség teszteket a gzip és a pigz programokkal.

Töltsünk fel egy fájlt 500 MB-nyi véletlenszerű adattal:

head -c 500M </dev/urandom >tesztfajl

Ekkor létrejön egy 524 288 000 byte méretű fájl, amiben véletlenszerű byte-ok sorakoznak. Ez elegendő méret ahhoz, hogy a  tömörítőprogramok működési sebességeit mérhessük rajta.

Itt most csak a tömörítések sebességeit mérjük, mivel egy véletlenszerűen feltöltött fájl nem igazán tömöríthető, valamint mindkét program a gzip tömörítési algoritmust használja, tehát itt nincs jelentősége a tömörítési aránynak.

Időmérések

Most becsomagoljuk a fájlt először gzip parancscsal, megtartva az eredeti fájlt, és az időt is mérjük közben, utána pedig a pigz paranccsal is betömörítjük ugyanígy. A parancsok tehát a következők:

time gzip -kf tesztfajl
time pigz -kf tesztfajl

Az eredmények pedig önmagukért beszélnek:

Gzip és pigz tömörítési sebességeinek az összehasonlítása

gzip: 6,748 másodperc, pigz pedig 4,070 másodperc.

A gépemben van egy I7-3770 CPU, ami 4 fizikai maggal rendelkezik. Ez HT-vel ugyan 8 magot jelent, de itt a virtuális magok úgy látszik nem dobnak bele sokat, tehát körülbelül negyedannyi idő alatt végzett a pigz. Ez nagyjából annyiszor rövidebb idő, mint amennyi fizikai mag van a processzoromban.

Nézzünk még egy próbát, most a 9-es tömörítési szintet használva, hogy jobban megdolgoztassuk a programokat. A parancsok tehát a következők:

time gzip -kf9 tesztfajl
time pigz -kf9 tesztfajl

Itt kicsit nagyobb lett az eltérés:

Gzip és pigz tömörítési sebességeinek az összehasonlítása a 9-es tömörítési szintekkel

gzip: 18,226 mp, pigz: 3,887 mp.

Tehát itt arányaiban még jobban teljesített a pigz.

CPU használat

A lényeget még nem vizsgáltuk, hogy mindez a háttérben hogyan dolgoztatja meg a processzort. Ezt a htop nevű program segítségével nézhetjük meg a legkényelmesebben.

Először tehát jöjjön a gzip a 9-es tömörítési szinttel:

time gzip -kf9 tesztfajl

És a tömörítés közben a másik fülön pedig a htop:

Htop - gzip parancs futása 1 szálon

Itt nincs is semmi különös, a folyamatok listájában legfelül látható a gzip szál, amint éppen 99,2%-on tolja a tömörítést. A felső részen is látható, hogy csak a 3. mag van meghajtva igazából.

Most lássuk ugyanezt a pigz-vel:

time pigz -kf9 tesztfajl

Htop - pigz parancs futása több szálon

Itt pedig látható, hogy minden mag dolgozik. Persze nehéz elkapni a jó pillanatot, mert váltakoznak a százalékok, és a processzek állapotai is, de itt most látszik, hogy van egy fő szál, maga a parancs, és van neki 8 másik al-folyamata.

 

 

Pigz használata a tar programmal

Ha sok alkönyvtár, illetve fájl van, amit rekurzívan kell becsomagolnunk egyetlen fájlba, akkor ezt rendszerint a tar paranccsal végezzük.

Egy teljesen hétköznapi példa több fájl vagy könyvtár becsomagolásra:

tar -czf kimenet.tgz <bemeneti fájlok, könyvtárak>

Ebben a példában a z kapcsolóval állítjuk be, hogy a tar gzipet használjon a tömörítésekhez. Ez a tar használatának a megszokott módja, viszont ez is csak egy szálon működik. Lehetőség van azonban más tömörítőprogramot is megadni a tar-nak a -I kapcsolóval. Az itt megadható tömörítőprogramoknál csak annyi a feltétel, hogy tudniuk kell használniuk a -d kapcsolót (manual oldal alapján).

Ennek megfelelően tehát használhatjuk a gzip helyett a pigz programot is a tar csomagolásoknál is:

tar -I pigz -cf kimenet.tgz <bemeneti fájlok, könyvtárak>

Így már a tar csomagolás is több szálon zajlik, amivel sok fájl, alkönyvtár esetén rengeteg időt spórolhatunk meg.

 

Konklúzió

Láthattuk tehát a pigz program hatékonyságát, aminek ha megszokjuk a használatát a mindennapokban, akkor jelentősen felgyorsíthatjuk vele például a szerverünkön végzett adatmentési munkáinkat.

 

Kapcsolódó tartalom, hasznos linkek: