Ich habe es herausgefunden:
Der Grund dafür ist, dass gzip
(in Bezug auf die CPU-Geschwindigkeit im Vergleich zur HD-Suchgeschwindigkeit heutzutage) extrem niedrige Puffergrößen verwendet werden .
Es liest einige KB aus der Eingabedatei, komprimiert sie und leert sie in die Ausgabedatei. Angesichts der Tatsache, dass dies eine Festplattensuche erfordert, können nur wenige Vorgänge pro Sekunde ausgeführt werden.
Der Grund, warum meine Leistung nicht skaliert wurde, ist, dass man schon gzip
wie verrückt gesucht hat.
Ich habe dies mit dem Unix- buffer
Dienstprogramm umgangen :
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Durch Puffern vieler Eingaben vor dem Senden an gzip kann die Anzahl kleiner Suchvorgänge drastisch reduziert werden. Die Optionen:
-s
und -m
sollen die Größe des Puffers angeben (ich glaube, es ist in KB, aber nicht sicher)
-p 100
stellt sicher, dass die Daten erst an gzip übergeben werden, wenn der Puffer zu 100% gefüllt ist
Wenn vier davon parallel ausgeführt werden, kann ich erwartungsgemäß einen Durchsatz von 4 * 25 MB / s erzielen.
Ich frage mich immer noch, warum gzip es nicht erlaubt, die Puffergröße zu erhöhen - auf diese Weise ist es ziemlich nutzlos, wenn es auf einer sich drehenden Festplatte ausgeführt wird.
EDIT : Ich habe ein paar weitere Komprimierungsprogramme ausprobiert:
bzip2
verarbeitet aufgrund der stärkeren / CPU-intensiveren Komprimierung nur 2 MB / s
lzop
scheint größere Puffer zuzulassen: 70 MB / s pro Kern und 2 Kerne können meine HD maximieren, ohne zu viel zu suchen
dd
das auch?dd
das mit seinerbs=
Option das gleiche kann , ja.Nachdem ich mir die ersten fünf Vorlesungen in der MIT OpenCourseware für 6.172: "Performance Engineering von Softwaresystemen" angesehen hatte, führte ich den Linux-Leistungsanalysator "perf" auf einer mäßig großen Testdatei aus. Das Ergebnis scheint Pipeline-Stillstände anzuzeigen, bei denen ein Befehl auf das Ergebnis eines vorhergehenden warten muss.
Der vorletzte Befehl wird kopiert
%ecx
und der letzte muss warten (Blockieren der Pipeline), bis das%cx
Register Daten zur Verwendung bereit hat. Dieser Pipeline-Stall hält die enthaltende Schleife hoch.Dies ist das Ergebnis eines wirklich obskuren C-Programmierstils der alten Schule.
quelle
Ein Tipp, der es auf einer Multi-Core- / Hyperthreading-CPU auf eine weitere Geschwindigkeitsstufe bringen könnte:
(unter der Annahme von Ubuntu)
moreutils enthält unter anderem "gnu parallel" - mit vielen Optionen, mit denen Sie mehr von Ihrer CPU nutzen können.
quelle