Compresser en multithreading sous Linux (gzip pigz, bzip2 lbzip2)
Table des matières
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.
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
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 ?
Il existe plusieurs algorithmes de compression sous GNU/Linux.
On peut utiliser 3 algorithmes avec tar pour compresser en plus d'archiver.
Voici un récapitulatif des commandes pour compresser et décompresser avec tar et avec chaque algorithme.
Pour Fedora :
Pour Ubuntu :
Pour Mageia (à partir de Mageia 4) :
Pour Gentoo :
Avec tar, utilisez comme ceci :
Je vais pour cela utiliser la commande time qui permet de voir le temps de traitement de l'opération :
Sans pigz :
Avec pigz :
Sans pigz : 3m9.090s
Avec pigz : 0m39.012s
Taille des fichiers :
On constate que la taille est identique (à quelques octets près).
Utilisation CPU :
Pour Fedora :
Pour les bases Red Hat (Nécessite EPEL) :
Pour Debian :
Pour Gentoo :
Avec tar, utilisez comme ceci :
Je vais pour cela utiliser la commande time qui permet de voir le temps de traitement de l'opération :
Sans lbzip2 :
Avec lbzip2 :
Sans lbzip2 : 8m51.954s
Avec lbzip2 : 1m6.937s
Taille du fichier compressé :
On constate que la taille est identique (à quelques octets près).
LZMA et Zstd sont par défaut multithread, je ne parle donc pas d'eux
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.
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 plusieurs algorithmes de compression sous GNU/Linux.
- gzip : qui a été créé à partir de 1991 pour remplacer le programme compress d'Unix
- 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
- 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.
- Zstandard : qui est un algorithme de compression de données sans perte développé par Facebook, ne nécessitant que peu de ressources pour la décompression.
On peut utiliser 3 algorithmes avec tar pour compresser en plus d'archiver.
- gzip compresse rapidement mais faiblement. (option -z)
- bzip2 compresse plus que gzip, mais est un peu plus long. (option -j)
- lzma2 compresse plus que bzip2 mais est beaucoup plus long que celui-ci. (option -J)
Voici un récapitulatif des commandes pour compresser et décompresser avec tar et avec chaque algorithme.
Compresser |
Décompresser |
|
---|---|---|
GZIP | Code BASH :
|
Code BASH :
|
BZIP2 | Code BASH :
|
Code BASH :
|
LZMA | Code BASH :
|
Code BASH :
|
Outils de compression multithread
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 :
Code BASH :
emerge -av pigz
Utilisation
Avec tar, utilisez comme ceci :
Code BASH :
tar -I pigz -cvf archive.tar.gz fichier
Comparaison de performances sans et avec pigz
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 des fichiers :
Code BASH :
ls -l | grep ".tar.gz" -rw-r--r-- 1 adrien adrien 1646332478 2 sept. 22:13 gzip.tar.gz -rw-r--r-- 1 adrien adrien 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 :
Avec pigz, mes 8 CPU fonctionnent, il y a 8 processus pigz :
lbzip2 pour bzip2
Installation
Pour Fedora :
Code BASH :
dnf install lbzip2
Pour les bases Red Hat (Nécessite EPEL) :
Code BASH :
dnf install lbzip2
Pour Debian :
Code BASH :
apt install lbzip2
Pour Gentoo :
Code BASH :
emerge -av lbzip2
Utilisation
Avec tar, utilisez comme ceci :
Code BASH :
tar -I lbzip2 -cvf archive.tar.bz2 fichier
Comparaison de performances sans et avec lbzip2
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 adrien adrien 1493091729 2 sept. 22:30 bzip2.tar.bz2 -rw-r--r-- 1 adrien adrien 1493749961 2 sept. 22:31 lbzip2.tar.bz2
On constate que la taille est identique (à quelques octets près).
Les autres algorithmes de compression
LZMA et Zstd sont par défaut multithread, je ne parle donc pas d'eux