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
tar.bz2
archivo?top
resultado muestra que subzip2
proceso 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.)Respuestas:
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 entornoBZIP2
en un valor como-3
intentar 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 quegzip -9
obzip2
con un nivel bajo podría ser un buen compromiso en comparación conbzip2 -9
. Este otro punto de referencia que también incluye lzma (el algoritmo de 7zip, por lo que puede usar en7z
lugar detar --lzma
) sugiere quelzma
a 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
parallel
para 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.fuente
7z
no 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 probarlogzip
,bzip2
yxz
en 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
).xz
. Usetar -J
o--xz
, no --lzma..lzma
se 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.Puede instalar
pigz
, gzip en paralelo y usar tar con la compresión multiproceso. Me gusta:Donde la
-I
opción es: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.
fuente
pbzip2
olbzip2
.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.
fuente
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.
fuente
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)
fuente