Verwendung von Multi Core für die Komprimierung / Dekomprimierung von tar + gzip / bzip

225

Normalerweise komprimiere ich mit tar zcvfund dekomprimiere mit tar zxvf(mit gzip aus Gewohnheit).

Ich habe kürzlich eine Quad-Core-CPU mit Hyperthreading erhalten, daher habe ich 8 logische Kerne, und ich stelle fest, dass viele der Kerne während der Komprimierung / Dekomprimierung nicht verwendet werden.

Gibt es eine Möglichkeit, die nicht verwendeten Kerne zu nutzen, um sie schneller zu machen?

user1118764
quelle
Die von Xiong Chiamiov oben vorgeschlagene Lösung funktioniert wunderbar. Ich hatte gerade meinen Laptop mit .tar.bz2 gesichert und es dauerte 132 Minuten mit nur einem CPU-Thread. Dann habe ich tar aus der Quelle kompiliert und installiert: gnu.org/software/tar Ich habe die im Konfigurationsschritt genannten Optionen eingefügt: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Ich habe das Backup erneut ausgeführt und es dauerte nur 32 Minuten. Das ist besser als eine 4-fache Verbesserung! Ich habe den Systemmonitor beobachtet und er hat alle 4 CPUs (8 Threads) die ganze Zeit über zu 100% flach gehalten. DAS ist die beste Lösung.
Warren Severin

Antworten:

309

Sie können pigz anstelle von gzip verwenden, wodurch die gzip-Komprimierung auf mehreren Kernen erfolgt. Anstatt die Option -z zu verwenden, würden Sie sie durch pigz leiten:

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

Standardmäßig verwendet pigz die Anzahl der verfügbaren Kerne oder acht, wenn dies nicht abgefragt werden konnte. Mit -pn können Sie mehr verlangen, z. B. -p 32. pigz hat die gleichen Optionen wie gzip, sodass Sie mit -9 eine bessere Komprimierung anfordern können. Z.B

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Mark Adler
quelle
3
Wie benutzt man pigz, um auf die gleiche Weise zu dekomprimieren? Oder funktioniert es nur für die Komprimierung?
user788171
42
pigz verwendet zwar mehrere Kerne zur Dekomprimierung, jedoch nur mit begrenzter Verbesserung gegenüber einem einzelnen Kern. Das Deflate-Format eignet sich nicht für eine parallele Dekomprimierung. Der Dekompressionsteil muss seriell erfolgen. Die anderen Kerne für die Pigz-Dekompression werden zum Lesen, Schreiben und Berechnen des CRC verwendet. Beim Komprimieren hingegen kommt pigz mit n Kernen einem Faktor der n- Verbesserung nahe .
Mark Adler
7
Der Bindestrich hier ist stdout (siehe diese Seite ).
Garrett
3
Ja. 100% kompatibel in beide Richtungen.
Mark Adler
4
Es wird praktisch keine CPU-Zeit für das Teern aufgewendet, daher würde dies nicht viel helfen. Das tar-Format ist nur eine Kopie der Eingabedatei mit Headerblöcken zwischen den Dateien.
Mark Adler
324

Sie können auch das tar-Flag "--use-compress-program =" verwenden, um tar mitzuteilen, welches Komprimierungsprogramm verwendet werden soll.

Verwenden Sie zum Beispiel:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
Jen
quelle
21
Dies ist ein fantastisches kleines Nugget an Wissen und verdient mehr Gegenstimmen. Ich hatte keine Ahnung, dass diese Option überhaupt existiert, und habe die Manpage im Laufe der Jahre einige Male gelesen.
Randall Hunt
2
@ValerioSchiavoni: Nicht hier, ich bekomme volle Last auf alle 4 Kerne (Ubuntu 15.04 'Vivid').
Bovender
8
Ich bevorzuge tar - dir_to_zip | pv | pigz > tar.filepv hilft mir zu schätzen, du kannst es überspringen. Trotzdem ist es einfacher zu schreiben und sich zu erinnern.
Offenso
@ NathanS.Watson-Haigh Ja, oder? Fügen Sie einfach den Programmnamen und die Argumente in Anführungszeichen ein. man tarsagt so, wie es tut dies .
März 2377
1
Im Jahr 2020 zstdist das schnellste Werkzeug, um dies zu tun. Deutliche Beschleunigung beim Komprimieren und Dekomprimieren. Verwenden Sie tar -cf --use-compress-program=zstdmtdazu Multithreading.
Jadelord
112

Allgemeiner Ansatz

Es gibt eine Option für das tarProgramm:

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

Sie können die Multithread-Version des Archivierungs- oder Kompressor-Dienstprogramms verwenden.

Die beliebtesten Multithread-Archivierer sind pigz (anstelle von gzip) und pbzip2 (anstelle von bzip2). Zum Beispiel:

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

Der Archivierer muss -d akzeptieren. Wenn Ihr Ersatzdienstprogramm diesen Parameter nicht hat und / oder Sie zusätzliche Parameter angeben müssen, verwenden Sie Pipes (fügen Sie ggf. Parameter hinzu):

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

Ein- und Ausgabe von Singlethread und Multithread sind kompatibel. Sie können mit der Multithread-Version komprimieren und mit der Singlethread-Version dekomprimieren und umgekehrt.

p7zip

Für p7zip zur Komprimierung benötigen Sie ein kleines Shell-Skript wie das folgende:

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

Speichern Sie es als 7zhelper.sh. Hier das Anwendungsbeispiel:

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

xz

In Bezug auf Multithread-XZ-Unterstützung. Wenn Sie Version 5.2.0 oder höher von XZ Utils ausgeführt werden , können Sie mehrere Kerne für die Kompression durch Setzen nutzen -Toder --threadsauf einen entsprechenden Wert über die Umgebungsvariable XZ_DEFAULTS (zB XZ_DEFAULTS="-T 0").

Dies ist ein Fragment des Menschen für die Version 5.1.0alpha:

Multithread-Komprimierung und -Dekomprimierung sind noch nicht implementiert, daher hat diese Option vorerst keine Auswirkungen.

Dies funktioniert jedoch nicht für die Dekomprimierung von Dateien, die nicht auch mit aktiviertem Threading komprimiert wurden. Vom Menschen für Version 5.2.2:

Threaded-Dekomprimierung wurde noch nicht implementiert. Es funktioniert nur mit Dateien, die mehrere Blöcke mit Größeninformationen in Blockheadern enthalten. Alle im Multithread-Modus komprimierten Dateien erfüllen diese Bedingung, im Single-Thread-Modus komprimierte Dateien jedoch nicht, selbst wenn --block-size = size verwendet wird.

Neu kompilieren mit Ersatz

Wenn Sie Teer aus Quellen erstellen, können Sie mit Parametern neu kompilieren

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

Nachdem Sie tar mit diesen Optionen neu kompiliert haben, können Sie die Ausgabe der Hilfe von tar überprüfen:

$ 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
quelle
1
Dies ist in der Tat die beste Antwort. Ich werde definitiv meinen Teer wieder aufbauen!
1
Ich habe gerade pbzip2 und mpibzip2 gefunden . mpibzip2 sieht für Cluster sehr vielversprechend aus oder wenn Sie beispielsweise einen Laptop und einen Multicore-Desktop-Computer haben.
Dies ist eine großartige und ausführliche Antwort. Es kann gut sein zu erwähnen, dass die Multithread-Komprimierung (z. B. mit pigz) nur aktiviert ist, wenn sie aus der Datei liest. Die Verarbeitung von STDIN kann tatsächlich langsamer sein.
10.
3
Plus 1 für xzOption. Es ist der einfachste und effektivste Ansatz.
Selurvedu
2
export XZ_DEFAULTS="-T 0"vor dem Aufruf tarmit Option -Jfür die xz-Komprimierung funktioniert wie ein Zauber.
Scai
13

Sie können die Verknüpfung -Ifür den --use-compress-programSchalter von tar verwenden und die pbzip2bzip2-Komprimierung für mehrere Kerne aufrufen :

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
panticz
quelle
Eine nette TL; DR für @ MaximSuslovs Antwort .
Einpoklum
Dies gibt tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash
1

Wenn Sie mehr Flexibilität bei Dateinamen und Komprimierungsoptionen wünschen, können Sie Folgendes verwenden:

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

Schritt 1: find

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

Dieser Befehl sucht nach den Dateien, die Sie archivieren möchten, in diesem Fall /my/path/*.sqlund /my/path/*.log. Fügen Sie so viele hinzu, -o -name "pattern"wie Sie möchten.

-execführt den nächsten Befehl mit den Ergebnissen aus find:tar

Schritt 2: tar

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

--transformist ein einfacher Parameter zum Ersetzen von Zeichenfolgen. Der Pfad der Dateien wird aus dem Archiv entfernt, sodass das Stammverzeichnis des Tarballs beim Extrahieren zum aktuellen Verzeichnis wird. Beachten Sie, dass Sie die -COption nicht zum Wechseln des Verzeichnisses verwenden können, da Sie die Vorteile verlieren find: Alle Dateien des Verzeichnisses wären enthalten.

-Pweist taran, absolute Pfade zu verwenden, damit die Warnung "Führendes` / 'aus Mitgliedsnamen entfernen "nicht ausgelöst wird. Führendes '/' wird --transformsowieso von entfernt .

-cf -weist taran, den Tarballnamen zu verwenden, den wir später angeben werden

{} +verwendet alle findzuvor gefundenen Dateien

Schritt 3: pigz

pigz -9 -p 4

Verwenden Sie so viele Parameter wie Sie möchten. In diesem Fall -9ist dies die Komprimierungsstufe und -p 4die Anzahl der für die Komprimierung vorgesehenen Kerne. Wenn Sie dies auf einem stark belasteten Webserver ausführen, möchten Sie wahrscheinlich nicht alle verfügbaren Kerne verwenden.

Schritt 4: Archivname

> myarchive.tar.gz

Schließlich.

Bloops
quelle
0

Ein relativ neueres ( De- ) Komprimierungswerkzeug, das Sie möglicherweise in Betracht ziehen möchten, ist zstandard . Es macht einen hervorragenden Job bei der Verwendung von Ersatzkernen und hat einige große Kompromisse hinsichtlich des Kompressionsverhältnisses gegenüber der (De-) Komprimierungszeit gemacht. Es ist auch sehr optimierbar, abhängig von Ihren Anforderungen an das Komprimierungsverhältnis.

pgebhard
quelle