web-dev-qa-db-fra.com

Utilisation de plusieurs noyaux pour la compression / décompression tar + gzip / bzip

Je compresse normalement en utilisant tar zcvf et décompresse en utilisant tar zxvf (en utilisant gzip à cause de l'habitude).

J'ai récemment eu un processeur quad core avec hyperthreading, donc j'ai 8 cœurs logiques et je remarque que beaucoup de cœurs sont inutilisés pendant la compression/décompression.

Est-il possible d'utiliser les cœurs inutilisés pour accélérer le processus?

191
user1118764

Vous pouvez utiliser pigz au lieu de gzip, qui effectue la compression gzip sur plusieurs cœurs. Au lieu d'utiliser l'option -z, vous la transmettriez via pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

Par défaut, pigz utilise le nombre de cœurs disponibles, ou huit s'il ne peut pas l'interroger. Vous pouvez demander plus avec -p n, par exemple. -p 32. pigz a les mêmes options que gzip, vous pouvez donc demander une meilleure compression avec -9. Par exemple.

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
263
Mark Adler

Vous pouvez également utiliser l'indicateur tar "--use-compress-program =" pour indiquer à tar le programme de compression à utiliser.

Par exemple utiliser:

tar -c --use-compress-program=pigz -f tar.file dir_to_Zip 
285
Jen

Approche commune

Il y a une option pour le programme tar:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Vous pouvez utiliser la version multithread de l’utilitaire Archiver ou Compression.

Les archiveurs multithreads les plus populaires sont pigz (au lieu de gzip) et pbzip2 (au lieu de bzip2). Par exemple:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

Archiveur doit accepter -d. Si votre utilitaire de remplacement n'a pas ce paramètre et/ou si vous avez besoin de spécifier des paramètres supplémentaires, utilisez des tuyaux (ajoutez des paramètres si nécessaire):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

L'entrée et la sortie de singlethread et multithread sont compatibles. Vous pouvez compresser en utilisant la version multithread et décompresser en utilisant la version singlethread et vice versa.

p7Zip

Pour que p7Zip soit compressé, vous avez besoin d’un petit script Shell ressemblant à ceci:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

Enregistrez-le sous 7zhelper.sh. Voici l'exemple d'utilisation:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

En ce qui concerne le support XZ multithread. Si vous utilisez la version 5.2.0 ou ultérieure de XZ Utils, vous pouvez utiliser plusieurs cœurs pour la compression en définissant -T ou --threads sur une valeur appropriée via la variable d'environnement XZ_DEFAULTS (par exemple, XZ_DEFAULTS="-T 0" ).

Ceci est un fragment de man pour la version 5.1.0alpha:

La compression et la décompression multithread n'étant pas encore implémentées, cette option n'a aucun effet pour l'instant.

Cependant, cela ne fonctionnera pas pour la décompression de fichiers qui n'ont pas été compressés avec le threading activé. De l'homme pour la version 5.2.2:

La décompression par thread n'a pas encore été implémentée. Il ne fonctionnera que sur des fichiers contenant plusieurs blocs avec des informations de taille dans les en-têtes de bloc. Tous les fichiers compressés en mode multi-thread répondent à cette condition, mais les fichiers compressés en mode mono-thread ne le sont pas, même si --block-size = size est utilisé.

Recompiler avec remplacement

Si vous construisez tar à partir de sources, vous pouvez alors recompiler avec des paramètres

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Après avoir recompilé tar avec ces options, vous pouvez vérifier la sortie de l'aide de tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz
100
Maxim Suslov

Vous pouvez utiliser le raccourci -I pour le commutateur --use-compress-program de tar, et appeler pbzip2 pour la compression bzip2 sur plusieurs cœurs:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
12
panticz.de

Si vous souhaitez plus de flexibilité avec les noms de fichiers et les options de compression, vous pouvez utiliser:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Étape 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

Cette commande recherchera les fichiers que vous souhaitez archiver, dans ce cas /my/path/*.sql et /my/path/*.log. Ajoutez autant de -o -name "pattern" que vous le souhaitez.

-exec exécutera la commande suivante en utilisant les résultats de find: tar

Étape 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transform est un paramètre de remplacement de chaîne simple. Il supprimera le chemin des fichiers de l'archive afin que la racine de l'archive devienne le répertoire actuel lors de l'extraction. Notez que vous ne pouvez pas utiliser l'option -C pour changer de répertoire car vous perdriez les avantages de find: tous les fichiers du répertoire seraient inclus.

-P indique à tar d'utiliser des chemins absolus pour ne pas déclencher l'avertissement "Suppression du`/'initial des noms de membre ". Le préfixe '/' est supprimé de toute façon par --transform.

-cf - dit à tar d'utiliser le nom de l'archive que nous spécifierons plus tard

{} + utilise tous les fichiers que find trouvé précédemment

Étape 3: pigz

pigz -9 -p 4

Utilisez autant de paramètres que vous le souhaitez. Dans ce cas, -9 est le niveau de compression et -p 4 est le nombre de cœurs dédiés à la compression. Si vous l'exécutez sur un serveur Web chargé, vous ne souhaiterez probablement pas utiliser tous les cœurs disponibles.

Étape 4: nom de l'archive

> myarchive.tar.gz

Finalement.

0
Bloops