Tengo algunos archivos JSON, de 20 GB cada uno, con los que quiero comprimir gzip
:
gzip file1.json
Esto ocupa un núcleo de CPU completo, todo bien.
Procesa alrededor de 25 MB / s (registrado atop
), mi disco duro puede leer 125 MB / sy tengo 3 núcleos de procesador libres, por lo que espero acelerar al comprimir varios archivos en paralelo. Entonces corro en otras terminales:
gzip file2.json
gzip file3.json
gzip file4.json
Sorprendentemente, mi rendimiento no aumenta; La CPU es de alrededor del 25% en cada núcleo, y mi HD todavía solo lee a 25 MB / s.
¿Por qué y cómo abordarlo?
dd
hacer lo mismo?dd
puede hacer lo mismo con subs=
opción, sí.Después de mirar las primeras cinco conferencias en el OpenCourseware de MIT para 6.172: "Ingeniería de rendimiento de sistemas de software", ejecuté el analizador de rendimiento de Linux 'perf' en un archivo de prueba moderadamente grande. El resultado parece mostrar paradas de canalización donde una instrucción tiene que esperar el resultado de una anterior.
La segunda última instrucción se está copiando
%ecx
y la última tiene que esperar (detener la canalización) hasta que el%cx
registro tenga datos listos para usar. Esta parada de tubería sostiene el bucle contenedor.Este es el resultado de un estilo de programación en C 'oscuro' realmente oscuro.
fuente
Un consejo que podría llevarlo a otro nivel de velocidad en una CPU multi-core / hyperthreading:
(suponiendo Ubuntu)
moreutils contiene, entre otras cosas, "gnu parallel", que tiene muchas opciones para ayudar a usar más de su CPU.
fuente