Komprimieren Sie eine große Anzahl großer Dateien schnell

16

Täglich werden ca. 200 GB Protokolldaten generiert, die auf ca. 150 verschiedene Protokolldateien verteilt sind.

Ich habe ein Skript, das die Dateien an einen temporären Speicherort verschiebt und ein tar-bz2 im temporären Verzeichnis ausführt.

Ich erhalte gute Ergebnisse, da 200 GB-Protokolle auf ca. 12-15 GB komprimiert werden.

Das Problem ist, dass es ewig dauert, die Dateien zu komprimieren. Der Cron- Job wird täglich um 2.30 Uhr ausgeführt und läuft bis 17.00-18.00 Uhr.

Gibt es eine Möglichkeit, die Geschwindigkeit der Komprimierung zu verbessern und den Auftrag schneller abzuschließen? Irgendwelche Ideen?

Machen Sie sich keine Gedanken über andere Prozesse und alles, der Ort, an dem die Komprimierung stattfindet, befindet sich auf einem NAS , und ich kann den NAS auf einer dedizierten VM mounten und das Komprimierungsskript von dort ausführen.

Hier ist die Ausgabe von top als Referenz:

top - 15:53:50 up 1093 days,  6:36,  1 user,  load average: 1.00, 1.05, 1.07
Tasks: 101 total,   3 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.1%us,  0.7%sy,  0.0%ni, 74.1%id,  0.0%wa,  0.0%hi,  0.1%si,  0.1%st
Mem:   8388608k total,  8334844k used,    53764k free,     9800k buffers
Swap: 12550136k total,      488k used, 12549648k free,  4936168k cached
 PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7086 appmon    18   0 13256 7880  440 R 96.7  0.1 791:16.83 bzip2
7085  appmon    18   0 19452 1148  856 S  0.0  0.0   1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon    15   0 85952 1944 1000 S  0.0  0.0   0:00.00 sshd: appmon@pts/0
30757 appmon    15   0 64884 1816 1032 S  0.0  0.0   0:00.01 -tcsh
anu
quelle
2
Wenn Sie über mehrere CPUs verfügen und diese in mehrere TAR-Dateien aufteilen können, können Sie mehrere Komprimierungen ausführen.
Jeff Schaller
@ JeffSchaller wäre es möglich, mehrere bzip2-Prozesse zu bekommen, die verschiedene Dateien komprimieren, aber in dieselbe tar.bz2Datei schreiben ?
Anu
2
Werden die Protokolldateien vor dem Wechsel zum NAS auf der lokalen Festplatte erstellt? Wenn ja komprimieren, dann verschieben; Auf diese Weise senden Sie beim Komprimieren nur 15 GB Daten über das Netzwerk und nicht 100 (Verschieben), sondern 115 (100 Lesen + 15 Schreiben). Alternativ sieht es so aus, als ob Sie an diesen einen bzip2-Prozess CPU-gebunden sind. Daher kann es hilfreich sein, mehrere gleichzeitig auszuführen (eine pro CPU) (bis Sie das E / A-Limit erreicht haben). Oder verwenden Sie eine einfachere Komprimierung (zB "gzip -1"). Es wird nicht so viel Speicherplatz gespart, aber es wird schneller ausgeführt.
Stephen Harris
@Sukminder Ich werde das auf jeden Fall ausprobieren und den Größenunterschied feststellen. Vielen Dank.
Anu
Ihre topAusgabe zeigt, dass Ihr Single-Thread- bzip2Prozess einen Kern maximal nutzt, dass Sie ihn jedoch auf einem Quad-Core-System ausführen (Ein Prozess mit 100% CPU -> 25.1%CPU-Zeit auf Benutzerbasis, 74% Leerlauf). Mit geringfügigen Änderungen können Sie also 4x so schnell fahren, es sei denn, etwas anderes wird zum Engpass. Lesen Sie die Antwort von Gilles sorgfältig durch. Verwenden Sie die CPU in der gleichen Box wie die Datenträger, auf denen sich die Daten für die Komprimierung befinden. (Sie können sogar einige Ihrer Dateien auf einer Box komprimieren, andere auf der anderen, und anschließend archivieren, damit beide CPUs verwendet werden.)
Peter Cordes

Antworten:

25

Der erste Schritt besteht darin, den Engpass herauszufinden: Handelt es sich um Festplatten-E / A, Netzwerk-E / A oder CPU?

Wenn der Engpass die Festplatten-E / A ist, können Sie nicht viel tun. Stellen Sie sicher, dass die Datenträger nicht viele parallele Anforderungen bedienen, da dies nur die Leistung beeinträchtigen kann.

Wenn der Engpass die Netzwerk-E / A ist, führen Sie den Komprimierungsprozess auf dem Computer aus, auf dem die Dateien gespeichert sind: Die Ausführung auf einem Computer mit einer stärkeren CPU hilft nur, wenn der CPU-Engpass vorliegt.

Wenn der Flaschenhals die CPU ist, sollten Sie als Erstes einen schnelleren Komprimierungsalgorithmus verwenden. Bzip2 ist nicht unbedingt eine schlechte Wahl - seine Hauptschwäche ist die Dekomprimierungsgeschwindigkeit - aber Sie könnten gzip verwenden und etwas Größe für die Komprimierungsgeschwindigkeit opfern oder andere Formate wie lzop oder lzma ausprobieren. Sie können auch die Komprimierungsstufe einstellen: Standardmäßig ist bzip2 -9(maximale Blockgröße, also maximale Komprimierung, aber auch längste Komprimierungszeit); Setzen Sie die Umgebungsvariable BZIP2auf einen Wert, wie er -3für Komprimierungsstufe 3 verwendet wird. In diesem Thread und in diesem Thread werden allgemeine Komprimierungsalgorithmen erläutert. insbesondere dieser von derobert zitierte blog post gibt einige benchmarks an, die darauf hindeuten, dass gzip -9oderbzip2mit einem niedrigen Niveau könnte ein guter Kompromiss im Vergleich zu sein bzip2 -9. Dieser andere Benchmark, der auch lzma (den Algorithmus von 7zip, den Sie möglicherweise 7zanstelle von verwenden tar --lzma) enthält, deutet darauf hin, dass lzmabei einer niedrigen Stufe das bzip2-Komprimierungsverhältnis schneller erreicht werden kann. Nahezu jede andere Wahl als bzip2 verbessert die Dekomprimierungszeit. Beachten Sie, dass das Komprimierungsverhältnis von den Daten abhängt und die Komprimierungsgeschwindigkeit von der Version des Komprimierungsprogramms, von dessen Kompilierung und von der CPU abhängt, auf der es ausgeführt wird.

Eine andere Option, wenn der Engpass die CPU ist und Sie mehrere Kerne haben, ist die Parallelisierung der Komprimierung. Dafür gibt es zwei Möglichkeiten. Einer, der mit jedem Komprimierungsalgorithmus funktioniert, besteht darin, die Dateien separat (entweder einzeln oder in wenigen Gruppen) parallelzu komprimieren und die Archivierungs- / Komprimierungsbefehle parallel auszuführen. Dies kann die Komprimierungsrate verringern, erhöht jedoch die Abrufgeschwindigkeit einer einzelnen Datei und funktioniert mit jedem Tool. Der andere Ansatz besteht darin, eine parallele Implementierung des Komprimierungswerkzeugs zu verwenden. Dieser Thread listet mehrere.

Gilles 'SO - hör auf böse zu sein'
quelle
4
"Wenn der Flaschenhals die Festplatten-E / A ist, können Sie nicht viel tun." Dies ist hier wahrscheinlich der Fall, da das Komprimierungsverhältnis bereits gut ist. Im Allgemeinen kann es sich jedoch lohnen, mehr CPU zu verbrauchen, um ein besseres Komprimierungsverhältnis zu erzielen (mit unterschiedlichen Komprimierungseinstellungen oder einem anderen Algorithmus), wenn E / A der Engpass ist. .. Sie können das "I" nicht wirklich reduzieren (weil Sie alle Daten einlesen müssen), aber Sie können das "O" manchmal signifikant reduzieren :-)
psmears
1
Wenn Sie anweisen, 7zkein "solides" Archiv zu erstellen oder die Größe von "soliden" Blöcken zu begrenzen, werden mehrere LZMA-Threads parallel ausgeführt (IIRC). Protokolldateidaten sind ein Sonderfall für die Komprimierung, da sie in der Regel sehr redundant sind (große Ähnlichkeit zwischen den Zeilen). Es ist auf jeden Fall lohnen Tests gzip, bzip2und xzauf der spezifischen Protokolldateien der OP, und nicht nur bei generischer Kompression Benchmarks sucht alle Optionen auszuschließen. Selbst schnelle Kompressoren sind eine Überlegung wert ( lzop, lz4, snappy).
Peter Cordes
Der derzeit bevorzugte LZMA-Kompressor ist xz. Verwenden Sie tar -Joder --xz, nicht --lzma. .lzmawird als "Legacy" -Dateiformat angesehen . Die vielen Iterationen der Dateiformate für die LZMA-Komprimierung sind etwas peinlich und sollten beim ersten Mal richtig sein. Aber AFAIK ist jetzt im Grunde genommen gut und .xz wird nicht durch ein weiteres Dateiformat für denselben Komprimierungsstream ersetzt.
Peter Cordes
7z hat eine ausgezeichnete Komprimierung und Multithreading, aber aufgrund des Archivformats (benötigt einen Index oder vielleicht Fehler?) Kann es nicht in der Mitte einer Pipeline verwendet werden - es wird nicht stdin und stdout verwendet zur gleichen Zeit
Xen2050
Das war sehr hilfreich und aufschlussreich. Mein Team stellte fest, dass die Operation über NFS ein großer Engpass war.
Anu
16

pigzMit der Multithread-Komprimierung können Sie gzip installieren , parallelisieren und tar verwenden. Mögen:

tar -I pigz -cf file.tar.gz *

Wo ist die -IOption:

-I, --use-compress-program PROG
  filter through PROG

Wenn Ihr NAS nicht über mehrere Kerne / eine leistungsfähige CPU verfügt, sind Sie natürlich trotzdem durch die CPU-Leistung eingeschränkt.

Die Geschwindigkeit der Festplatte / des Arrays, auf der die VM und die Komprimierung ausgeführt werden, kann ebenfalls ein Engpass sein.

Labyrinthe
quelle
1
Und wenn Sie bzip2 verwenden möchten, können Sie pbzip2oder verwenden lbzip2.
Radovan Garabík
2
Dies ist Ihre beste Antwort. Stellen Sie jedoch zunächst sicher, dass sich Ihr erster Schritt an einem Speicherort befindet, der sich im selben Dateisystem befindet wie die Originaldateien. Andernfalls ist Ihr "Verschieben" wirklich ein Byte-Kopieren-Dann-Löschen. Auf demselben Dateisystem ist eine Verschiebung eine Neuanordnung von Dateisystemverknüpfungen. Das ist um Größenordnungen schneller. Bei meinen Protokolldateien, die Hunderte von Gigabyte groß sind, hat pigz den Unterschied ausgemacht. Sie können angeben, wie viele parallele Threads ausgeführt werden sollen. Solange Ihre CPU mehrere Kerne hat, würde ich nicht viel Zeit damit verbringen, Nachforschungen anzustellen. Sie werden wahrscheinlich auf jeden Fall Schweinchen wollen; Sie können Ihre Geschwindigkeit sofort erhalten.
Mike S
Sehen Sie sich nach dem Ferkeln die Ausgänge Ihres htop und iostat an und beobachten Sie die Systemleistung, wenn Sie Ihr System weiter untersuchen möchten. Aber auch hier werde ich nicht länger versuchen, große Dateien ohne pigz zu komprimieren. Auf einem modernen Multicore-System ist es einfach albern, es nicht zu verwenden. Es ist so ein sofortiger Gewinn - Sie werden sehen.
Mike S
7

Bei weitem die schnellste und effektivste Methode zum Komprimieren von Daten besteht darin, weniger davon zu generieren.

Welche Arten von Protokollen generieren Sie? 200 GB pro Tag klingen nach ziemlich viel (es sei denn, Sie sind Google oder ein ISP ...). Bedenken Sie, dass 1 MB Text etwa 500 Seiten umfasst. Sie generieren also das Äquivalent von 100 Millionen Seiten Text pro Tag Füllen Sie die Kongressbibliothek in einer Woche.

Sehen Sie sich Ihre Protokolldaten an, wenn Sie sie irgendwie reduzieren können und trotzdem das erhalten, was Sie aus den Protokollen benötigen. Zum Beispiel durch Verringern der Protokollebene oder Verwenden eines Terser-Protokollformats. Wenn Sie die Protokolle für Statistikzwecke verwenden, verarbeiten Sie die Statistiken im laufenden Betrieb und sichern Sie eine Datei mit der Zusammenfassung. Filtern Sie dann die Protokolle, bevor Sie sie für die Speicherung komprimieren.

Emily L.
quelle
1
Dies ist eine interessante philosophische Lösung. Die Lösung der meisten Probleme im Leben besteht darin, das Problem überhaupt nicht zu haben, nicht wahr? Das ist, bis man den Vorschlag genau untersucht und feststellt, dass es Hunderte von Menschen und Tausende von Zulassungen gibt, die man durchlaufen muss, um dies zu erreichen.
Anu
1
@anu Es wurde kein Kontext zu der Frage angegeben, daher habe ich keinen angenommen. Und können Sie mir bitte sagen, woher Sie die tausend Zulassungen haben? Mir kommt es so vor, als hätten Sie sich das nur ausgedacht.
Emily L.
Ich stimme dem zu. Dies ist die oft übersehene, aber einmal bemerkte, herausragende Lösung für viele Probleme des Lebens.
jrw32982 unterstützt Monica
1
Nun, jetzt, da ich dort nicht mehr arbeite, kann ich zumindest offenbaren, dass dies ein Problem bei Apple war. Genauer gesagt auf dem Service-Stack, der den Online-App-Store bedient ... ja, Tausende von Genehmigungen sind so ziemlich Realität, da sie Tausende von Microservices haben und jeweils Protokolle erstellen, die komprimiert werden müssen und bei Änderungen abgemeldet werden müssen logging levels etc ... Wie auch immer ... wir haben eine Lösung für dieses interne System gefunden, die ziemlich genau dem parallelen gzip entspricht, das auf andere microservices ausgelagert wird.
Anu
3

Sie können den Umfang der Komprimierung (in Bezug auf den gesparten Speicherplatz) verringern, um sie schneller zu machen. Zunächst ist bzip2 VIEL langsamer als gzip, obwohl es kleiner komprimiert. Sie können auch die Komprimierungsstufe von bzip2, gzip oder den meisten Komprimierungsprogrammen ändern, um die Größe gegen die Geschwindigkeit auszutauschen.

Wenn Sie nicht bereit sind, die Geschwindigkeitsgröße zu tauschen, können Sie wahrscheinlich die gleiche oder eine kleinere Größe erhalten, während Sie mit einem Kompressor, der LZMA verwendet (z. B. xz), eine Geschwindigkeitsverbesserung erzielen.

Sie werden Benchmarks finden, wenn Sie suchen. Am besten führen Sie jedoch einige Tests mit Ihrer eigenen Datei auf Ihrer Zielhardware durch.

EricS
quelle
3

Wenn die einzige Voraussetzung ist, dass die Komprimierung schnell ist , würde ich lz4 sehr empfehlen .

Es wird an vielen Stellen verwendet, an denen die Komprimierungsgeschwindigkeit wichtiger ist als das Komprimierungsverhältnis (z. B. Dateisysteme mit transparenter Komprimierung wie ZFS).

pdo
quelle
Noch nie zuvor davon gehört, gibt es ein Programm, das wahrscheinlich bereits praktisch überall installiert ist und das es verwendet, wie xz?
Xen2050