Was ist der beste Weg, um standardmäßig parallel bzip2 und gzip zu verwenden?

41

Bzip2 und gzip verwenden nur einen Kern, obwohl viele Computer mehr als einen Kern haben. Es gibt jedoch Programme wie lbzip2, pbzip2 und pigz, die alle verfügbaren Kerne verwenden und versprechen, mit bzip2 und gzip kompatibel zu sein.

Also, was ist der beste Weg, um diese Programme standardmäßig zu verwenden, so dass tar cfa file.tar.bz2 directorylbzip2 / pbzip2 anstelle von bzip2 verwendet wird? Natürlich will ich nichts kaputt machen.

Elmicha
quelle
2
Aus Neugier für alle: Ist paralleles gzip / bzip wirklich schneller als seriell? Ich würde mir vorstellen, dass die Schreibgeschwindigkeit der Festplatte und andere Einschränkungen eher ein Problem darstellen.
con-f-use
@ con-f-use Nur wenn Sie theoretisch über SSDs verfügen, kann dies mit zunehmender Gesamtgröße des Archivs schneller sein.
Marco Ceppi
1
Auf einem System mit 16 CPUs konnte durch den Wechsel von gzip zu pigz die Zeit auf 1,2 TB Teer gesenkt und über das Netzwerk übertragen werden. Das Ergebnis wurde von 18 Stunden Backup und 14 Stunden Test auf 4 Stunden Backup und 2 Stunden Test getestet. Es gibt eine Menge möglicher Engpässe, Festplattengeschwindigkeit, Netzwerkgeschwindigkeit und Rechenleistung, aber in diesem Fall war dies definitiv mehr CPU-gebunden als IO-gebunden. Dies ist ein High-End-System, Ihre Ergebnisse können variieren. Nicht, dass es wichtig wäre, aber dies war am RHEL6
cs_alumnus

Antworten:

32

Sie können bzip2, bunzip2 und bzcat mit lbzip2 und gzip, gunzip, gzcat und zcat mit pigz verknüpfen:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

Ich habe lbzip2 anstelle von pbzip2 gewählt, weil /usr/share/doc/lbzip2/README.gz "besser" aussieht als /usr/share/doc/pbzip2/README.gz. Auch das tar-Handbuch spricht von lbzip2 .

Bearbeiten:

pigz-2.1.6, das in Precise Pangolin enthalten ist, lehnt es ab, Dateien mit unbekannten Suffixen (z. B. initramfs - *. img) zu dekomprimieren. Dies ist in pigz-2.2.4 behoben, das mit Quantal ausgeliefert wird. Warten Sie also möglicherweise bis Quantal, installieren Sie das Quantal-Paket manuell oder verknüpfen Sie gunzip / gzcat / zcat noch nicht.

Elmicha
quelle
7
Dies funktioniert gut, da / usr / local / bin / vor / bin / im $ PATH der meisten Leute steht. Wenn etwas direkt / bin / gunzip aufruft oder jemand zuerst / bin in seinem $ PATH hat, wird pigz nicht verwendet. Damit dies auch für sie funktioniert, können Sie dpk-divert verwenden und so etwas für alle Binärdateien tun. sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipEs besteht jedoch die Möglichkeit, dass pigz nicht zu 100% mit allen gzip-Flags kompatibel ist. Seien Sie also vorsichtig.
Mark McKinstry
31

Die Symlink-Idee ist wirklich gut.
Eine andere funktionierende Lösung ist Alias tar:

alias tar='tar --use-compress-program=pbzip2'

bzw.

alias tar='tar --use-compress-program=pigz'

Es wird eine andere Art von Standard erstellt.

Bastian Ebeling
quelle
zusätzlichen Vorteil: Sie alias wie ‚partar‘ , wenn Sie möchten , erhalten die ursprüngliche Funktionalität (aus irgendeinem Grund) .. traurig ‚ptar‘ genommen wird von Perl - Implementierung verwenden können
jena
13

Die Symlink-Antwort ist wirklich falsch. Es würde das Standard-gzip (oder bzip2) durch pigz (oder pbzip2) für das gesamte System ersetzen. Während die parallelen Implementierungen den einzelnen Prozessversionen bemerkenswert ähnlich sind, können geringfügige Unterschiede bei den Befehlszeilenoptionen zu Problemen bei den Kernsystemprozessen führen, die von diesen Unterschieden abhängen.

Die Option "--use-compress-program" ist eine viel bessere Wahl. Eine zweite Möglichkeit (ähnlich dem Alias) wäre, die von GNU tar unterstützte Umgebungsvariable TAR_OPTIONS zu setzen:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
user154053
quelle
6
Ich benutze die Symlinks seit 2011 und habe keinen Bruch gesehen (abgesehen von dem in der Bearbeitung erwähnten Fall). Und wenn solche subtilen Unterschiede nicht gefunden und gemeldet werden, bleiben wir für immer bei nicht parallelen Versionen. Wenn Sie TAR_OPTIONS = "- use-compress-program = pbzip2" verwenden, scheint es nicht so, als könnten Sie zwischen bzip2 und gzip unterscheiden.
Elmicha
Das hat bei mir nicht funktioniert.
Derek Perkins
3

Eine faszinierende Möglichkeit besteht darin, tar neu zu kompilieren, um standardmäßig Multithreading zu verwenden. Von dieser Stapelüberlaufantwort kopiert

Neukompilierung mit Ersetzung

Wenn Sie tar 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
Tom Koch
quelle
-2

Verwenden Sie in Ihren ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
Foo Bar
quelle
1
Dies funktioniert nur, wenn Sie das Programm gzip(oder gunzip) direkt in der Befehlszeile der Shell aufrufen . Andere Programme (wie tar) sind davon nicht betroffen.
Christian Hudon