Logiciels en ligne de commande

Compresser en multithreading sous Linux (gzip pigz, bzip2 lbzip2)

Cet article a été mis à jour, vous consultez ici une archive de cet article!
Table des matières

tar_gz







Introduction





De nos jours, la plupart des ordinateurs, qu'ils soient fixes ou portables ou même serveurs, ils possèdent un processeur avec plusieurs cœurs.



Wikipedia :
Un processeur est dit multithread s'il est capable d'exécuter efficacement plusieurs threads simultanément.

Un thread ou fil (d'exécution) ou tâche est similaire à un processus car tous deux représentent l'exécution d'un ensemble d'instructions du langage machine d'un processeur. Du point de vue de l'utilisateur, ces exécutions semblent se dérouler en parallèle. Toutefois, là où chaque processus possède sa propre mémoire virtuelle, les threads d'un même processus se partagent sa mémoire virtuelle. Par contre, tous les threads possèdent leur propre pile d’appel.




Le logiciel tar étant un logiciel d'archive, il ne compresse pas s'il n'est pas couplé à gzip, bzip2 ou lzma (xz).

Qu'il ne soit pas multithread n'est pas gênant en soi, puisqu'il n'y a pas besoin de "calculer".



En revanche, lorsqu'on exécute



Code BASH :
tar -czf archive.tar.gz fichier




on compresse avec gzip. Le processeur travaille donc. Mais ... avec un seul cœur.



Si nous possédons un Intel Core i7, avec 8 cœurs donc, un sel sera utilisé.



Et si on utilisait les 8 pour aller ... 8 fois plus vite ?





Rapide tour des outils de compression





Il existe 3 algorithmes de compression sous GNU/Linux.



  1. gzip : qui a été créé à partir de 1991 pour remplacer le programme compress d'Unix
  2. bzip2 : qui est à la fois le nom d'un algorithme de compression de données et d'un logiciel libre développé par Julian Seward entre 1996 et 2000 qui l'implémente
  3. LZMA : qui est un algorithme de compression de données sans perte en développement jusqu'à 2001. Il est utilisé en version 2 (LZMA2) avec l'outil xz.





On peut utiliser ces 3 algorithmes avec tar pour compresser en plus d'archiver.

  1. gzip compresse rapidement mais faiblement.
  2. bzip2 compresse plus que gzip, mais est un peu plus long.
  3. lzma2 compresse plus que bzip2 mais est plus long que celui-ci.





Voici un récapitulatif des commandes pour compresser et décompresser avec tar et avec chaque algorithme.



Compresser

Décompresser

GZIP
Code BASH :
tar czvf achrive.tar.gz fichier1 fichier2
Code BASH :
tar xzvf achrive.tar.gz
BZIP2
Code BASH :
tar cjvf achrive.tar.bz2 fichier1 fichier2
Code BASH :
tar xjvf achrive.tar.bz2
LZMA2
Code BASH :
tar cJvf achrive.tar.xz fichier1 fichier2
Code BASH :
tar xJvf achrive.tar.xz






Outils de compression multithread





Tous les tests de ce tutoriel ont été réalisés avec Fedora release 19 (Schrödinger’s Cat) x86_64 sur une machine disposant d'un Intel(R) Core(TM) i7-3610QM CPU @ 2.30GHz, et un disque dur SSD OCZ Vertex M4 256Go

Le fichier test de 4.9Go qui est un disque dur virtuel d'une VirtualBox

Code BASH :
ls -lh | grep "VM.vdi"
-rwxrwxrwx  1 adrienfedo adrienfedo 4,6G 28 août  22:20 VM.vdi
 




pigz pour gzip







Installation





Pour Fedora :

Code BASH :
yum install pigz




Pour Ubuntu :

Code BASH :
apt-get install pigz




Pour Mageia (à partir de Mageia 4) :

Code BASH :
urpmi pigz




Pour Gentoo/Calculate Linux :

Code BASH :
emerge -qv pigz


Avec Gentoo et Calculate Linux, vous pouvez substituer gzip par pigz en ajoutant le FLAG symlink



Utilisation





Avec tar, utilisez comme ceci :



Code BASH :
tar -I pigz -cvf archive.tar.gz fichier






Comparaison de performances sans et avec pigz







Temps de compression




Je vais pour cela utiliser la commande time qui permet de voir le temps de traitement de l'opération :



Sans pigz :

Code BASH :
time tar -czvf gzip.tar.gz VM.vdi
VM.vdi
 
real    3m9.090s
user    3m2.491s
sys    0m8.496s
 




Avec pigz :

Code BASH :
time tar -I pigz -cvf pigz.tar.gz VM.vdi 
VM.vdi
 
real    0m39.012s
user    4m17.009s
sys    0m6.806s
 




Sans pigz : 3m9.090s

Avec pigz : 0m39.012s



Taille du fichier compressé




Code BASH :
 ls -l | grep ".tar.gz"
-rw-r--r--  1 adrienfedo adrienfedo 1646332478  2 sept. 22:13 gzip.tar.gz
-rw-r--r--  1 adrienfedo adrienfedo 1643944367  2 sept. 22:00 pigz.tar.gz
 




On constate que la taille est identique (à quelques octets près).





Utilisation CPU




Sans pigz, on constate un seul processus gzip dans htop :

multithread_gzip





Avec pigz, mes 8 CPU tournent à fond les ballons :

multithread_pigz









lbzip2 pour bzip2







Installation





Pour Fedora :

Code BASH :
yum install lbzip2




Pour Ubuntu :

Code BASH :
apt-get install lbzip2




Pour Mageia (pbzip2 disponible uniquement) :

Code BASH :
urpmi pbzip2




Pour Gentoo/Calculate Linux :

Code BASH :
emerge -qv lbzip2


Avec Gentoo et Calculate Linux, vous pouvez substituer bzip2 par lbzip2 en ajoutant le FLAG symlink



Utilisation





Avec tar, utilisez comme ceci :



Code BASH :
tar -I lbzip2 -cvf archive.tar.gz fichier






Comparaison de performances sans et avec lbzip2







Temps de compression




Je vais pour cela utiliser la commande time qui permet de voir le temps de traitement de l'opération :



Sans lbzip2 :

Code BASH :
time tar -cjvf bzip2.tar.bz2 VM.vdi
VM.vdi
 
real    8m51.954s
user    8m44.225s
sys    0m8.156s
 




Avec lbzip2 :

Code BASH :
time tar -I lbzip2 -cvf lbzip2.tar.bz2 VM.vdi 
VM.vdi
 
real    1m6.937s
user    7m25.987s
sys    0m15.594s
 




Sans lbzip2 : 8m51.954s

Avec lbzip2 : 1m6.937s



Taille du fichier compressé




Code BASH :
ls -l | grep ".tar.bz2"
-rw-r--r--  1 adrienfedo adrienfedo 1493091729  2 sept. 22:30 bzip2.tar.bz2
-rw-r--r--  1 adrienfedo adrienfedo 1493749961  2 sept. 22:31 lbzip2.tar.bz2
 




On constate que la taille est identique (à quelques octets près).





Utilisation CPU




Sans lbzip2, on constate un seul processus bzip2 dans htop :

multithread_bzip2





Avec lbzip2, mes 8 CPU tournent à fond les ballons :

multithread_lbzip2





A noter que pour compresser avec bzip2 en multithread, il existe aussi pbzip2. Je ne l'ai pas traité ici puisque il est "moins rapide" que lbzip2.





Récapitulatif





[table style="margin:auto;"]

[head]

[col]Logiciel de compression[/col]

[col]Temps de compression[/col]

[col]Ratio de compression[/col]

[col]Nombre de CPU utilisés[/col]

[/head]

[row]

[col]gzip[/col]

[col]pigz[/col]

[col]bzip2[/col]

[col]lbzip2[/col]

[/row]

[row]

[col]3m9.090s[/col]

[col]0m39.012s[/col]

[col]8m51.954s[/col]

[col]1m6.937s[/col]

[/row]

[row]

[col]2.96[/col]

[col]2.96[/col]

[col]3.26[/col]

[col]3.26[/col]

[/row]

[/table]