Comprima rápidamente una gran cantidad de archivos grandes

16

Tengo alrededor de 200 GB de datos de registro generados diariamente, distribuidos entre aproximadamente 150 archivos de registro diferentes.

Tengo un script que mueve los archivos a una ubicación temporal y hace un tar-bz2 en el directorio temporal.

Obtengo buenos resultados ya que los registros de 200 GB se comprimen a aproximadamente 12-15 GB.

El problema es que lleva una eternidad comprimir los archivos. El trabajo cron se ejecuta diariamente a las 2:30 a.m. y continúa hasta las 5: 00-6: 00 p.m.

¿Hay alguna manera de mejorar la velocidad de la compresión y completar el trabajo más rápido? ¿Algunas ideas?

No se preocupe por otros procesos y todo, la ubicación donde ocurre la compresión es en un NAS , y puedo ejecutar montar el NAS en una VM dedicada y ejecutar el script de compresión desde allí.

Aquí está la salida de top para referencia:

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
fuente
2
Si tiene varias CPU y tiene o puede dividirlo en varios archivos tar, puede ejecutar múltiples compresiones.
Jeff Schaller
@JeffSchaller ¿sería posible hacer que varios procesos de bzip2 compriman diferentes archivos pero escriban en el mismo tar.bz2archivo?
Anu
2
¿Se generan los archivos de registro en el disco local antes de pasar al NAS? Si es así, comprima y luego mueva; de esa manera, solo está enviando 15 Gb de datos a través de la red en lugar de 100 (mover) y luego 115 (100read + 15write) al comprimir. Alternativamente, parece que podría estar vinculado a la CPU en ese proceso bzip2, por lo que puede ser útil ejecutar múltiples en paralelo (uno por CPU) (hasta que alcance el límite de E / S). O utilice una compresión más simple (por ejemplo, "gzip -1"). No ahorrará tanto espacio en el disco, pero se ejecutará más rápido.
Stephen Harris
@Sukminder Definitivamente intentaré esto y veré la diferencia de tamaño. Gracias.
Anu
Su topresultado muestra que su bzip2proceso de subproceso único está maximizando un núcleo, pero que lo está ejecutando en un sistema de cuatro núcleos (un proceso que utiliza 100% de CPU -> 25.1%tiempo de CPU de espacio de usuario, 74% inactivo). Entonces, con cambios menores, puede ir 4 veces más rápido, a menos que otra cosa se convierta en el cuello de botella. Lee la respuesta de Gilles cuidadosamente. Considere usar la CPU en el mismo cuadro que los discos que contienen los datos para realizar la compresión. (Incluso puede comprimir algunos de sus archivos en un cuadro, otros en el otro, y archivarlos después, de modo que se utilicen ambas CPU.)
Peter Cordes,

Respuestas:

25

El primer paso es descubrir cuál es el cuello de botella: ¿es E / S de disco, E / S de red o CPU?

Si el cuello de botella es la E / S del disco, no hay mucho que pueda hacer. Asegúrese de que los discos no atiendan muchas solicitudes paralelas, ya que eso solo puede disminuir el rendimiento.

Si el cuello de botella es la E / S de la red, ejecute el proceso de compresión en la máquina donde se almacenan los archivos: ejecutarlo en una máquina con una CPU más robusta solo ayuda si la CPU es el cuello de botella.

Si el cuello de botella es la CPU, lo primero que debe considerar es usar un algoritmo de compresión más rápido. Bzip2 no es necesariamente una mala elección, su principal debilidad es la velocidad de descompresión, pero puede usar gzip y sacrificar algo de tamaño por la velocidad de compresión, o probar otros formatos como lzop o lzma. También puede ajustar el nivel de compresión: bzip2 está predeterminado en -9(tamaño de bloque máximo, por lo que la compresión máxima, pero también el tiempo de compresión más largo); establezca la variable de entorno BZIP2en un valor como -3intentar el nivel de compresión 3. Este hilo y este hilo discuten algoritmos de compresión comunes; en particular esta publicación de blog citada por derobert da algunos puntos de referencia que sugieren que gzip -9obzip2con un nivel bajo podría ser un buen compromiso en comparación con bzip2 -9. Este otro punto de referencia que también incluye lzma (el algoritmo de 7zip, por lo que puede usar en 7zlugar de tar --lzma) sugiere que lzmaa un nivel bajo puede alcanzar la relación de compresión bzip2 más rápido. Casi cualquier opción que no sea bzip2 mejorará el tiempo de descompresión. Tenga en cuenta que la relación de compresión depende de los datos, y la velocidad de compresión depende de la versión del programa de compresión, de cómo se compiló y de la CPU en la que se ejecuta.

Otra opción si el cuello de botella es la CPU y tiene múltiples núcleos es paralelizar la compresión. Hay dos maneras de hacerlo. Uno que funciona con cualquier algoritmo de compresión es comprimir los archivos por separado (individualmente o en algunos grupos) y usarlos parallelpara ejecutar los comandos de archivado / compresión en paralelo. Esto puede reducir la relación de compresión, pero aumenta la velocidad de recuperación de un archivo individual y funciona con cualquier herramienta. El otro enfoque es utilizar una implementación paralela de la herramienta de compresión; Este hilo enumera varios.

Gilles 'SO- deja de ser malvado'
fuente
44
"Si el cuello de botella es la E / S del disco, no hay mucho que pueda hacer". Probablemente eso sea cierto aquí, ya que la relación de compresión ya es buena, pero en general cuando E / S es el cuello de botella, puede valer la pena considerar usar más CPU para obtener una mejor relación de compresión (usando diferentes configuraciones de compresión o un algoritmo diferente). .. realmente no puede reducir la "I" (porque necesita leer todos los datos) pero a veces puede reducir significativamente la "O" :-)
psmears
1
Si le dice que 7zno haga un archivo "sólido" o limite el tamaño de los bloques "sólidos", ejecutará múltiples hilos LZMA en paralelo, IIRC. Los datos del archivo de registro son un caso especial para la compresión, ya que tienden a ser muy redundantes (mucha similitud entre líneas). Definitivamente vale la pena probarlo gzip, bzip2y xzen los archivos de registro específicos del OP, en lugar de solo mirar puntos de referencia de compresión genéricos para descartar cualquier opción. Incluso los compresores rápidos son dignas de consideración ( lzop, lz4, snappy).
Peter Cordes
El compresor LZMA preferido en estos días es xz. Use tar -Jo --xz, no --lzma. .lzmase considera un formato de archivo "heredado" . Las múltiples iteraciones de los formatos de archivo para la compresión LZMA son un poco embarazosas, y es algo que deberían haber hecho bien la primera vez. Pero AFAIK es básicamente bueno ahora, y .xz no está a punto de ser reemplazado por otro formato de archivo para la misma secuencia de compresión.
Peter Cordes
7z tiene una excelente compresión y subprocesamiento múltiple, pero debido al formato de archivo (¿necesita un índice o quizás errores?) No creo que pueda usarse en el medio de una tubería: no usará stdin y stdout al mismo tiempo
Xen2050
Esto fue realmente útil y perspicaz. Mi equipo pensó que la operación a través de NFS era un gran cuello de botella.
Anu
16

Puede instalar pigz, gzip en paralelo y usar tar con la compresión multiproceso. Me gusta:

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

Donde la -Iopción es:

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

Por supuesto, si su NAS no tiene múltiples núcleos / CPU potente, de todos modos está limitado por la potencia de la CPU.

La velocidad del disco duro / matriz en la que se ejecuta la VM y la compresión también puede ser un cuello de botella.

mazs
fuente
1
Y si quieres usar bzip2, puedes usar pbzip2o lbzip2.
Radovan Garabík
2
Esta es tu mejor respuesta. Pero primero, asegúrese de que su primer movimiento sea a una ubicación que esté en el mismo sistema de archivos que los archivos originales. De lo contrario, su "movimiento" es realmente un byte-copy-then-delete. En el mismo sistema de archivos, un movimiento es una reorganización de los enlaces del sistema de archivos. Eso es órdenes de magnitud más rápido. Para mis archivos de registro que son cientos de Gigabytes grandes, pigz marcó la diferencia. Puedes decirle cuántos hilos paralelos ejecutar. Mientras su CPU tenga múltiples núcleos, no pasaría mucho tiempo investigando. Probablemente quieras pigz en cualquier caso; puedes obtener tu aceleración de inmediato.
Mike S
Una vez que esté buscando, observe sus salidas de htop y iostat y observe el rendimiento de su sistema, si desea investigar más sobre su sistema. Pero, de nuevo, ya no intentaré comprimir archivos grandes sin pigz. En un sistema multinúcleo moderno, es tonto no usarlo. Es una victoria tan inmediata, ya lo verás.
Mike S
7

Con mucho, la forma más rápida y efectiva de comprimir datos es generar menos.

¿Qué tipo de registros estás generando? 200 GB diarios suenan bastante (a menos que sea google o algún ISP ...), considere que 1 MB de texto es de aproximadamente 500 páginas, por lo que está generando el equivalente a 100 millones de páginas de texto por día, obtendrá llenar la biblioteca del congreso en una semana.

Vea sus datos de registro si puede reducirlos de alguna manera y aún así obtener lo que necesita de los registros. Por ejemplo, bajando el nivel de registro o usando un formato de registro terser. O si está utilizando los registros para estadísticas, procese las estadísticas sobre la marcha y voltee un archivo con el resumen y luego filtre los registros antes de la compresión para el almacenamiento.

Emily L.
fuente
1
Esta es una solución filosófica interesante. La solución de la mayoría de los problemas de la vida es evitar tener el problema por completo, ¿no es así? Eso es hasta que uno examina de cerca la sugerencia y se da cuenta de que hay cientos de personas y miles de aprobaciones por las que uno tiene que pasar para lograr esto.
Anu
1
@anu No se dio contexto a la pregunta, así que supuse que no. ¿Y podría decirme de dónde obtuvo el número 1000 de aprobaciones? Para mí parece que acabas de inventar eso.
Emily L.
Voy a votar esto. Esta es la solución destacada a menudo pasada por alto, pero una vez notada, para muchos de los problemas de la vida.
jrw32982 apoya a Monica
1
Bueno ... ahora que ya no trabajo allí, al menos puedo revelar que esto fue un problema en Apple. Más específicamente en la pila de servicios que sirve a la tienda de aplicaciones en línea ... así que sí, miles de aprobaciones son prácticamente una realidad porque tienen miles de microservicios y cada uno de ellos produce registros que deben comprimirse y tendrán que firmar para cambiar su niveles de registro, etc ... De todos modos ... descubrimos una solución para este BTW interno ... que es más o menos equivalente al gzip paralelo que se descarga a otros microservicios.
Anu
3

Puede reducir la cantidad de compresión (en términos de espacio ahorrado) para hacerlo más rápido. Para empezar, bzip2 es MUCHO más lento que gzip, aunque se comprime más pequeño. También puede cambiar el nivel de compresión de bzip2, gzip o la mayoría de los programas de compresión para cambiar el tamaño por la velocidad.

Si no está dispuesto a cambiar el tamaño de la velocidad, es probable que aún pueda obtener el mismo tamaño o menor mientras sigue mejorando la velocidad con un compresor que usa LZMA (por ejemplo, xz).

Si busca, encontrará puntos de referencia, pero su mejor opción es hacer algunas pruebas con su propio archivo en su hardware de destino.

EricS
fuente
3

Si el único requisito es que la compresión sea rápida , recomendaría muy bien lz4 .

Se usa en muchos lugares donde la velocidad de compresión es más importante que la relación de compresión (por ejemplo, sistemas de archivos con compresión transparente como ZFS)

pdo
fuente
Nunca he oído hablar de él antes, ¿hay algún programa que probablemente ya esté instalado prácticamente en todas partes que lo use, como xz?
Xen2050