Utilisation de plusieurs cœurs pour la compression / décompression tar + gzip / bzip

225

Je compresse normalement en utilisant tar zcvfet décompresse en utilisant tar zxvf(en utilisant gzip en raison de l'habitude).

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

Existe-t-il un moyen d'utiliser les cœurs inutilisés pour le rendre plus rapide?

user1118764
la source
La solution proposée par Xiong Chiamiov ci-dessus fonctionne à merveille. Je venais de sauvegarder mon ordinateur portable avec .tar.bz2 et cela a pris 132 minutes en utilisant un seul thread cpu. Ensuite, j'ai compilé et installé tar à partir de la source: gnu.org/software/tar J'ai inclus les options mentionnées dans l'étape de configuration: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip J'ai exécuté à nouveau la sauvegarde et cela n'a pris que 32 minutes. C'est mieux qu'une amélioration 4X! J'ai regardé le moniteur du système et il a gardé les 4 processeurs (8 threads) à plat à 100% tout le temps. C'EST la meilleure solution.
Warren Severin

Réponses:

309

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 le feriez passer par 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 -pn, 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
Mark Adler
la source
3
Comment utilisez-vous pigz pour décompresser de la même manière? Ou cela fonctionne-t-il uniquement pour la compression?
user788171
42
pigz utilise plusieurs cœurs pour la décompression, mais seulement avec une amélioration limitée par rapport à un seul cœur. Le format de dégonflage ne se prête pas à la décompression parallèle. La portion de décompression doit être effectuée en série. Les autres cœurs de décompression pigz sont utilisés pour la lecture, l'écriture et le calcul du CRC. Lors de la compression d'autre part, pigz se rapproche d'un facteur n amélioration avec n cœurs.
Mark Adler
7
Le tiret ici est stdout (voir cette page ).
Garrett
3
Oui. 100% compatible dans les deux sens.
Mark Adler
4
Il n'y a effectivement pas de temps CPU passé au goudronnage, donc cela n'aiderait pas beaucoup. Le format tar n'est qu'une copie du fichier d'entrée avec des blocs d'en-tête entre les fichiers.
Mark Adler
324

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

Par exemple, utilisez:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
Jen
la source
21
C'est une petite pépite impressionnante de connaissances et mérite plus de votes positifs. Je ne savais même pas que cette option existait et j'ai lu la page de manuel plusieurs fois au fil des ans.
Randall Hunt
2
@ValerioSchiavoni: Pas ici, je reçois la pleine charge sur les 4 cœurs (Ubuntu 15.04 'Vivid').
bovender
8
Je préfère tar - dir_to_zip | pv | pigz > tar.filepv m'aide à estimer, vous pouvez le sauter. Mais il est toujours plus facile d'écrire et de se souvenir.
Offenso
@ NathanS.Watson-Haigh Oui, vous. Mettez simplement le nom du programme et les arguments entre guillemets. man tarle dit, tout comme cela .
Marc.2377
1
En 2020, zstdest l'outil le plus rapide pour ce faire. Accélération notable lors de la compression et de la décompression. Utilisez tar -cf --use-compress-program=zstdmt-le pour le multi-threading.
jadelord
112

Approche commune

Il y a une option pour le tarprogramme:

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

Vous pouvez utiliser la version multithread de l'utilitaire d'archivage ou de compression.

Les archiveurs multithread 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

L'archiveur doit accepter -d. Si votre utilitaire de remplacement n'a pas ce paramètre et / ou si vous devez 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 du fil unique et du multithread sont compatibles. Vous pouvez compresser en utilisant la version multithread et décompresser en utilisant la version single thread et vice versa.

p7zip

Pour p7zip pour la compression, vous avez besoin d'un petit script shell comme suit:

#!/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

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

Ceci est un fragment de l'homme pour la version 5.1.0alpha:

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

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

La décompression filetée n'a pas encore été mise en œuvre. Il ne fonctionnera que sur les 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 remplissent cette condition, mais les fichiers compressés en mode single-thread ne le font pas même si --block-size = size est utilisé.

Recompilation avec remplacement

Si vous construisez tar à partir de sources, vous pouvez 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
Maxim Suslov
la source
1
C'est en effet la meilleure réponse. Je vais certainement reconstruire mon goudron!
1
Je viens de trouver pbzip2 et mpibzip2 . mpibzip2 semble très prometteur pour les clusters ou si vous avez un ordinateur portable et un ordinateur de bureau multicœur par exemple.
Il s'agit d'une excellente et élaborée réponse. Il peut être bon de mentionner que la compression multithread (par exemple avec pigz) n'est activée que lors de la lecture du fichier. Le traitement de STDIN peut en fait être plus lent.
2015
3
Plus 1 pour l' xzoption. C'est l'approche la plus simple mais efficace.
selurvedu
2
export XZ_DEFAULTS="-T 0"avant d'appeler taravec l'option -Jpour la compression xz fonctionne comme un charme.
scai
13

Vous pouvez utiliser le raccourci -Ipour le --use-compress-programcommutateur tar et invoquer pbzip2pour la compression bzip2 sur plusieurs cœurs:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
panticz
la source
Un joli TL; DR pour la réponse de @ MaximSuslov .
einpoklum
Cela renvoie tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash
1

Si vous voulez avoir 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/*.sqlet /my/path/*.log. Ajoutez-en autant -o -name "pattern"que vous le souhaitez.

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

Étape 2: tar

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

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

-Pindique tard'utiliser des chemins absolus, de sorte qu'il ne déclenche pas l'avertissement "Suppression de la première ligne" / "des noms de membres". '/' En tête avec être supprimé de --transformtoute façon.

-cf -indique tard'utiliser le nom tarball que nous spécifierons plus tard

{} +utilise tous les fichiers findtrouvés précédemment

Étape 3: pigz

pigz -9 -p 4

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

Étape 4: nom de l'archive

> myarchive.tar.gz

Finalement.

Bloops
la source
0

Un outil de (dé) compression relativement récent que vous pourriez envisager est zstandard . Il fait un excellent travail en utilisant des cœurs de rechange, et il a fait de grands compromis en termes de taux de compression par rapport au temps de (dé) compression. Il est également hautement ajustable en fonction de vos besoins en taux de compression.

pgebhard
la source