Lo descubrí:
La razón es que gzip
opera en (en términos de velocidad de CPU frente a velocidad de búsqueda HD en estos días) tamaños de búfer extremadamente bajos .
Lee unos pocos KB del archivo de entrada, lo comprime y lo pasa al archivo de salida. Dado que esto requiere una búsqueda de disco duro, solo se pueden realizar algunas operaciones por segundo.
La razón por la que mi rendimiento no se amplió es porque ya uno gzip
estaba buscando como loco.
Trabajé alrededor de esto usando la buffer
utilidad Unix :
buffer -s 100000 -m 10000000 -p 100 < file1.json | gzip > file1.json.gz
Al almacenar una gran cantidad de entrada antes de enviarla a gzip, el número de búsquedas pequeñas se puede reducir drásticamente. Las opciones:
-s
y -m
deben especificar el tamaño del búfer ( creo que está en KB, pero no estoy seguro)
-p 100
se asegura de que los datos solo se pasen a gzip una vez que el búfer esté lleno al 100%
Al ejecutar cuatro de estos en paralelo, podría obtener un rendimiento de 4 * 25 MB / s, como se esperaba.
Todavía me pregunto por qué gzip no permite aumentar el tamaño del búfer; de esta manera, es bastante inútil si se ejecuta en un disco giratorio.
EDITAR : Probé algunos comportamientos más de programas de compresión:
bzip2
solo procesa 2 MB / s debido a su compresión más fuerte / más intensiva de CPU
lzop
parece permitir búferes más grandes: 70 MB / s por núcleo, y 2 núcleos pueden maximizar mi HD sin buscar demasiado
dd
hacer lo mismo?