Frage bzip2 zu langsam. Mehrere Kerne sind verfügbar


Ich führe diesen Befehl aus:

pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2

Es dauert zu lange. Ich schaue mir die Prozesse mit an top. Der bzip2-Prozess benötigt etwa 95% und postgres 5% eines Kerns. Das wa Eintrag ist niedrig. Dies bedeutet, dass die Festplatte nicht der Flaschenhals ist.

Was kann ich tun, um die Leistung zu steigern?

Vielleicht sollte bzip2 mehr Kerne verwenden. Der Server hat 16 Kerne.

Oder verwenden Sie eine Alternative zu bzip2?

Was kann ich tun, um die Leistung zu steigern?


21
2017-09-08 18:39


Ursprung


Wenn Sie bzip2 aus Legacy-Gründen nicht benötigen, ist es meine persönliche Erfahrung, dass xz eine bessere Komprimierung / Zeit bietet als bzip2. Es ist auch threaded, wenn Sie ein neues Programm genug bekommen, und es lässt Sie Zeit und Speicherverbrauch von gzipish bis zu massiv skalieren, je nachdem, was Sie wollen. - Perkins
"Pigz" ist eine andere Option - es erzeugt gzip-Ausgabe statt bzip2-Ausgabe. Und grundsätzlich versteht alles gzip. - Criggie
Sie könnten versuchen, es symmetrisch mit GnuPG mit bzip2-Komprimierung zu verschlüsseln; Es scheint überraschend schnell zu sein, verglichen mit der Komprimierung aus einem unbekannten Grund, sogar mit der höchsten Komprimierungsstufe. Es ist möglich, dass der Algorithmus schneller als die Effizienz meines regulären Komprimierungsprogramms ist, das GUI-basiert ist. - Shule
Sie haben die Anforderungen Ihres alternativen Algorithmus nicht angegeben. Bzip2 ist teilbar. Ist das wichtig für dich? - Martin Smith
"Was kann ich tun, um die Leistung zu steigern?"- komprimiere es nicht? Du sagst nicht, dass du es komprimieren musst, und Nicht-Tun-Arbeit ist immer schneller als Tun-Arbeit. Mach die Festplatte zum Engpass." - TessellatingHeckler


Antworten:


Es gibt viele Komprimierungsalgorithmen um und bzip2 ist einer der langsameren. Einfach gzip tendenziell deutlich schneller, in der Regel nicht viel schlechter Kompression. Wenn Geschwindigkeit am wichtigsten ist, lzop ist mein Lieblings. Schlechte Kompression, aber oh so schnell.

Ich beschloss, etwas Spaß zu haben und ein paar Algorithmen zu vergleichen, einschließlich ihrer parallelen Implementierungen. Die Eingabedatei ist die Ausgabe von pg_dumpall Befehl auf meiner Arbeitsstation, eine 1913 MB SQL-Datei. Die Hardware ist ein älterer Quad-Core i5. Die Zeiten sind Wanduhrzeiten nur der Kompression. Parallelimplementierungen sind so eingestellt, dass alle 4 Kerne verwendet werden. Tabelle sortiert nach Komprimierungsgeschwindigkeit.

Algorithm     Compressed size        Compression          Decompression

lzop           398MB    20.8%      4.2s    455.6MB/s     3.1s    617.3MB/s
lz4            416MB    21.7%      4.5s    424.2MB/s     1.6s   1181.3MB/s
brotli (q0)    307MB    16.1%      7.3s    262.1MB/s     4.9s    390.5MB/s
brotli (q1)    234MB    12.2%      8.7s    220.0MB/s     4.9s    390.5MB/s
zstd           266MB    13.9%     11.9s    161.1MB/s     3.5s    539.5MB/s
pigz (x4)      232MB    12.1%     13.1s    146.1MB/s     4.2s    455.6MB/s
gzip           232MB    12.1%     39.1s     48.9MB/s     9.2s    208.0MB/s
lbzip2 (x4)    188MB     9.9%     42.0s     45.6MB/s    13.2s    144.9MB/s
pbzip2 (x4)    189MB     9.9%    117.5s     16.3MB/s    20.1s     95.2MB/s
bzip2          189MB     9.9%    273.4s      7.0MB/s    42.8s     44.7MB/s
pixz (x4)      132MB     6.9%    456.3s      4.2MB/s     7.9s    242.2MB/s
xz             132MB     6.9%   1027.8s      1.9MB/s    17.3s    110.6MB/s
brotli (q11)   141MB     7.4%   4979.2s      0.4MB/s     3.6s    531.6MB/s

Wenn die 16 Kerne Ihres Servers inaktiv genug sind, dass alle für die Komprimierung verwendet werden können, pbzip2 wird Ihnen wahrscheinlich eine sehr deutliche Beschleunigung geben. Aber du brauchst noch mehr Geschwindigkeit und du kannst ~ 20% größere Dateien tolerieren, gzip ist wahrscheinlich deine beste Wette.

Aktualisieren: Ich fügte hinzu brotli (siehe TOOGAMs Antwort) Ergebnisse in die Tabelle. brotliDie Einstellung der Komprimierungsqualität hat einen sehr großen Einfluss auf das Komprimierungsverhältnis und die Geschwindigkeit. Daher habe ich drei Einstellungen hinzugefügt (q0, q1, und q11). Der Standardwert ist q11, aber es ist extrem langsam und immer noch schlimmer als xz. q1 sieht aber sehr gut aus; das gleiche Kompressionsverhältnis wie gzip, aber 4-5 mal so schnell!

Aktualisieren: Hinzugefügt lbzip2 (siehe gmathts Kommentar) und zstd (Johnny's Kommentar) zum Tisch und sortierte es nach Kompressionsgeschwindigkeit. lbzip2 legt die bzip2 Familie wieder in den Lauf durch Komprimieren dreimal so schnell wie pbzip2 mit einem großen Kompressionsverhältnis! zstd sieht auch vernünftig aus aber ist vorbei brotli (q1) im Verhältnis und in der Geschwindigkeit.

Meine ursprüngliche Schlussfolgerung, die klar ist gzip ist die beste Wette, fängt an, fast albern auszusehen. Obwohl für die Allgegenwart, kann es immer noch nicht geschlagen werden;)


35
2017-09-08 23:40



Für eine ähnliche Tabelle mit weitaus mehr Algorithmen siehe mattmahoney.net/dc/text.html. - Dougal
@Dougal Fair genug. Mein Test hat ähnliche Daten wie das OP (pg_dumpall Ausgabe), so ist es wahrscheinlich ein bisschen repräsentativer :) - marcelm
Zstd ist ein weiterer, der in der Tabelle fehlt - zum Komprimieren unserer Protokolldateien habe ich festgestellt, dass ein einzelner zstd-Kernprozess 16 Kerne von pbzip2 mit vergleichbaren Komprimierungsraten übertrifft. - Johnny
lz4 ist etwas schneller und effizienter als lzop, Apropos. Es verwendet jedoch mehr RAM, was in eingebetteten Systemen relevant ist. - Daniel B
Wenn Sie Multithread-Versionen testen möchten, können Sie es versuchen zstd -T4 auch. Für sehr schnelle Einstellungen können Sie es versuchen zstd -T4 -1, wie zstd standardmäßig auf -3Dies ist wahrscheinlich die Einstellung, die Sie getestet haben. - Cyan


Benutze pbzip2.

Das Handbuch sagt:

pbzip2 ist eine parallele Implementierung der Block-Sortierdatei bzip2   Kompressor, der PThreads verwendet und eine nahezu lineare Beschleunigung bei SMP erreicht   Maschinen. Die Ausgabe dieser Version ist vollständig kompatibel mit bzip2   v1.0.2 oder neuer (dh: alles, was mit pbzip2 komprimiert wurde, kann sein   dekomprimiert mit bzip2).

Es erkennt automatisch die Anzahl der Prozessoren und erstellt Threads entsprechend.


36
2017-09-08 19:22



Das ist in Ordnung, wenn Sie eine Datei komprimieren, das funktioniert aber furchtbar durch eine Pipe - camelccc
@camelccc Warum sagst du das? Ich finde das überhaupt nicht. Sie benötigen einen schnellen Erzeuger oder einen großen Puffer auf dem Rohr davor für optimale Leistung, aber das gilt auch für pixz und pigz auch auf einer Pfeife. - Michael - sqlbot
Hängt davon ab, wie groß was er komprimiert. Wenn Sie einen großen Puffer haben, ist es in Ordnung, wie Sie sagen, wenn Sie etwas, das viel größer ist als physischer RAM ist, habe ich gefunden, dass Dinge interessanter werden können. Wie Sie jedoch wahrscheinlich für jeden Komprimierungsalgorithmus sagen. - camelccc
bzip2 kann ein ordentliches Stück Ram verwenden, so dass 16 bzip-Worker zu einem Zeitpunkt ausgeführt werden könnten, die nicht-trivialen RAM über 1 GB verbrauchen. BTW, lbzip2 scheint bessere Geschwindigkeit, Speicherverbrauch und geringfügig bessere Komprimierung zu bieten pbzip2. Hier gibt es Benchmarks: vbtechsupport.com/1614 - gmatht
@gmatht lbzip2 sieht nett aus! Ich habe es meiner Antwort hinzugefügt :) - marcelm


  • Google's Brotli ist ein neueres Format, das in letzter Zeit einige breite Unterstützung in Browsern gefunden hat, da es eine beeindruckende Komprimierung, eine beeindruckende Geschwindigkeit und vielleicht die beeindruckendste Kombination / Ausgewogenheit dieser beiden Funktionen aufweist.

Daten:

Vergleich von Brotli, Deflate, Zopfli, LZMA, LZHAM und Bzip2-Komprimierungsalgorithmen

  • z.B., dieses Diagramm berichten, dass Brotli ungefähr 6-14 schneller ist als Bzip2.

CanIUse.com: Feature: Brotli zeigt Unterstützung von Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (aber nicht Opera Mini oder Microsoft Internet Explorer).

Vergleich: Brotli vs deflate gegen zopfli vs lzma vs lzham vs bzip2

  • Wenn Sie nach Kompressionsgeschwindigkeit suchen, dann suchen Sie, welche Linien in diesem Diagramm weiter rechts liegen. (Die Einträge oben in diesem Diagramm zeigen eine enge Komprimierungsrate. Higher = tigher. Wenn jedoch die Komprimierungsgeschwindigkeit Priorität hat, sollten Sie besser darauf achten, welche Zeilen weiter rechts im Diagramm angezeigt werden.)
Vergleich: Komprimierungsrate vs Komprimierungsgeschwindigkeit für 7-Zip ZStandard-Methoden


8
2017-09-09 08:09



Interessant, von denen ich gehört hatte brotli vorher, aber ich habe es vergessen. Ich habe es in die Tabelle der Benchmarks in meiner Antwort aufgenommen! Ich war eigentlich ein wenig enttäuscht von seiner Leistung, außer bei der Qualitätseinstellung 1, wo es die gleiche Kompressionsrate wie bei gzipmit einer viel höheren Geschwindigkeit. - marcelm


Benutzen zstd. Wenn es gut genug für Facebook ist, ist es wahrscheinlich auch gut genug für dich.

Auf eine ernstere Anmerkung ist es tatsächlich ziemlich gut. Ich benutze es jetzt für alles, weil es einfach funktioniert, und es erlaubt Ihnen, die Geschwindigkeit für das Verhältnis im großen Maßstab zu tauschen (meistens ist die Geschwindigkeit sowieso wichtiger als die Größe, da die Speicherung billig ist, aber Geschwindigkeit ist ein Flaschenhals).
Bei Komprimierungsstufen, die eine vergleichbare Gesamtkomprimierung wie bzip2 erreichen, ist es wesentlich schneller. Wenn Sie bereit sind, zusätzliche CPU-Zeit zu bezahlen, können Sie dies tun fast erzielen ähnliche Ergebnisse wie LZMA (obwohl es dann langsamer als bzip2 ist). Bei etwas schlechteren Kompressionsverhältnissen ist es viel viel schneller als bzip2 oder irgendeine andere Mainstream-Alternative.

Jetzt komprimieren Sie einen SQL-Dump, der nur so peinlich trivial ist, wie er komprimieren kann. Selbst die ärmsten Kompressoren schneiden bei dieser Art von Daten gut ab.
Du kannst also rennen zstd mit einer niedrigeren Komprimierungsstufe, die ausgeführt wird Dutzende Male schneller und immer noch erreichen 95-99% die gleiche Kompression für diese Daten.

Als Bonus, wenn Sie dies oft tun und etwas mehr Zeit investieren möchten, können Sie das "trainieren" zstd Kompressor vor der Zeit, die sowohl Verdichtungsverhältnis und Geschwindigkeit erhöht. Beachten Sie, dass für das Training, um gut zu arbeiten, müssen Sie es einzelne Datensätze, nicht die ganze Sache füttern. So wie das Tool funktioniert, erwartet es viele kleine und etwas ähnliche Samples für das Training, nicht einen riesigen Blob.


2
2017-09-10 15:37



besser noch, verwenden Sie pzstd (parallele Version) auf Multicore-Maschinen - borowis


Es sieht so aus, als ob das Anpassen (Senken) der Blockgröße einen signifikanten Einfluss auf die Komprimierungszeit haben kann.

Hier sind einige Ergebnisse des Experiments, das ich auf meiner Maschine gemacht habe. Ich habe das benutzt time Befehl zum Messen der Ausführungszeit. input.txt ist eine ~ 250mb Textdatei, die beliebige json-Datensätze enthält.

Verwenden der Standard (größten) Blockgröße (--best wählt nur das Standardverhalten aus):

# time cat input.txt | bzip2 --best > input-compressed-best.txt.bz

real    0m48.918s
user    0m48.397s
sys     0m0.767s

Verwenden der kleinsten Blockgröße (--fast Streit):

# time cat input.txt | bzip2 --fast > input-compressed-fast.txt.bz

real    0m33.859s
user    0m33.571s
sys     0m0.741s

Dies war eine überraschende Entdeckung, wenn man bedenkt, dass die Dokumentation sagt:

Kompressions- und Dekompressionsgeschwindigkeit werden praktisch nicht von Block beeinflusst   Größe


1
2017-07-25 11:12



Mein derzeitiger Favorit ist pbzip2. Hast du das auch versucht? Diese Frage bezieht sich auf eine Umgebung, in der 16 Kerne verfügbar sind. - guettli
@guettli leider muss ich bei bzip bleiben. Ich benutze es für Hadoop-Jobs und bzip ist eine der eingebauten Komprimierung dort. In gewisser Weise ist es bereits parallelisiert. - jkukul