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
tar.bz2
Datei schreiben ?top
Ausgabe zeigt, dass Ihr Single-Thread-bzip2
Prozess 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.)Antworten:
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 UmgebungsvariableBZIP2
auf einen Wert, wie er-3
fü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, dassgzip -9
oderbzip2
mit einem niedrigen Niveau könnte ein guter Kompromiss im Vergleich zu seinbzip2 -9
. Dieser andere Benchmark, der auch lzma (den Algorithmus von 7zip, den Sie möglicherweise7z
anstelle von verwendentar --lzma
) enthält, deutet darauf hin, dasslzma
bei 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)
parallel
zu 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.quelle
7z
kein "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 Testsgzip
,bzip2
undxz
auf 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
).xz
. Verwenden Sietar -J
oder--xz
, nicht --lzma..lzma
wird 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.pigz
Mit der Multithread-Komprimierung können Sie gzip installieren , parallelisieren und tar verwenden. Mögen:Wo ist die
-I
Option: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.
quelle
pbzip2
oder verwendenlbzip2
.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.
quelle
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.
quelle
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).
quelle