Disminuyendo el tiempo que toma comprimir un archivo en Linux

Imagen de Epe

Tema: 

Este artículo ha sido publicado originalmente en mi blog HC6EP.com

Bueno, seguramente todos los que andamos en el mundo de Linux conocemos bien al comando gzip.
Este comando hace algo muy importante y simple: comprime la información contenida en un archivo.
Realmente las tasas de compresión de gzip son buenas, tan buenas que es el compresor al momento por excelencia en nuestro mundo de Linux. Casi todas las aplicaciones se comprimen por gzip, por más que hayan programas que compriman más en términos de tamaño o que compriman más rápido.

Hablando de rapidez, descubrí un día que el comando gzip usa solamente un procesador, lanza un sólo hilo para realizar la compresión, a pesar de que tu equipo tenga 2, 4, 8, 16 procesadores, o lo que sea, gzip hace uso de uno sólo.

Esto no es eficiente, si tengo un equipo con 4 procesadores por ejemplo, mejor fuera que se lanzaran 4 hilos de este programa y que el proceso de compresión fuera más rápido ya que normalmente es demorado por su necesidad de encontrar cadenas similares para comprimir.

Para esto, existe una alternativa 100% compatible con gzip, se llama "pigz", es un paquete que puedes instalar con

yum install pigz

Luego de instalado, simplemente en vez de utilizar gzip para comprimir, uso pigz, es un drop in, es decir, puedo simplemente sustituir "gzip" por "pigz" y lograr la compresión.

Por ejemplo si quiero hacer un tar podría usar:

tar cf - /etc | gzip -c -> etc.tar.gz

Esto comprimirá como siempre se ha hecho, con gzip. Con un sólo hilo, y por tanto como siempre le hemos visto de rápido o lento.

Ahora, lo mismo lo quiero hacer con pigz? así:

tar cf - /etc | pigz -c -> etc.tar.gz

y ya... pigz determinará cuántos procesadores tienes y lanzará tantos hilos de pigz como procesadores tengas, y el proceso será mucho más rápido, te lo prometo.

Aquí un ejemplo, esto es hecho en mi laptop que tiene 2 procesadores:


eperez@eperez ~$ ls -lh t
-rw-rw-r--. 1 eperez eperez 17M Jun 10 20:52 t

Como puedes ver el archivo t tiene 17M de tamaño, vamos a comprimirlo con gzip y medir cuánto demoró.

eperez@eperez ~$ time gzip -c t > t.gzip

real 0m9.533s
user 0m9.339s
sys 0m0.060s

Ahora vamos a hacer lo mismo con pigz:

eperez@eperez ~$ time pigz -c t > t.pigz

real 0m5.064s
user 0m9.416s
sys 0m0.119s

te fijas, tomó 9.5 segundos comprimir los 17MB usando el gzip y tomó 5segundos comprimir los 17MB usando pigz (sin embargo el tiempo de usuario fue muy similar).

pigz hizo uso de los dos procesadores, el tiempo se dividió entre ambos.. y gzip sólo usó uno...

Lógico, si tienes más procesadores puedes notar que los tiempos bajan bastante..

suerte y dale uso!

Comentarios

no entiendo bien tu pregunta,

Imagen de Epe

no entiendo bien tu pregunta, pero pigz determinará cuántos procesadores ve en /proc/cpuinfo, entiendo que no importa mucho si es multiples, uno, dos o lo que sea, mi máquina tiene sólo un núcleo con dos procesadores, y lanzó dos hilos.

aprovecho para decir que se puede controlar la cantidad de procesadores que usará el pigz, por ejemplo así vea 16 procesadors tú le puedes decir que use 4 o lo que sea usando -p #

por ejemplo pigz -p 4 archivo.tar

comprimirá "archivo.tar" usando 4 procesos.

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

Me confundí por la terminología intel

Imagen de iknaxio

Me confundí por la terminología intel, ya que te venden procesadores con 'n' núcleos.

Yo tengo una laptop con core i7 y al ejecutar:


iknaxio@zeronode:~$ cat /proc/cpuinfo | grep 'processor'

Obtengo:


processor : 0
processor : 1
processor : 2
processor : 3

"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio
floss.iknaxio.net

Lo probé

Imagen de iknaxio

Lo probé y aunque definitivamente es mas rápido comprimir con pigz en mi core i7, igual vi una diferencia en el tiempo de usuario:


root@zeronode:/home/iknaxio/Downloads# time gzip -c zdesktop_7_1_2_ga_b10978_linux_i686.tgz > t.gzip

real 0m4.850s
user 0m3.408s
sys 0m1.284s


root@zeronode:/home/iknaxio/Downloads# time pigz -c zdesktop_7_1_2_ga_b10978_linux_i686.tgz > t.gzip

real 0m2.387s
user 0m5.772s
sys 0m0.568s

Otra ejecución:


root@zeronode:/home/iknaxio/Downloads# time gzip -c zcs-7.1.4_GA_2555.RHEL6_64.20120105094542.tgz > t.gzip

real 0m21.212s
user 0m14.973s
sys 0m5.548s


root@zeronode:/home/iknaxio/Downloads# time pigz -c zcs-7.1.4_GA_2555.RHEL6_64.20120105094542.tgz > t.gzip

real 0m9.823s
user 0m26.034s
sys 0m3.320s

"Transporta un puñado de tierra todos los días y construirás una montaña" - Confucio
floss.iknaxio.net

sí mira, en el caso del user

Imagen de Epe

sí mira, en el caso del user time, es el tiempo combinado de todos los cores que toma.. por eso incluso le ves mayor, pero lo importante es el tiempo real, el tiempo real es el que nos pasa a nosotros los humanos... el user es todo el tiempo que el usuario consumió sumado en todos los procesadores, por eso le ves más alto (incluso debería ser muy parecido al user time del gzip)

Saludos
epe

EcuaLinux.com

+(593) 9 9924 6504

Servicios en Software Libre

A instalar y colocar un alias

Imagen de deathUser

A instalar y colocar un alias tipo ...


alias gzip="pigz -p 4"

Sabes si hay como decirle a tar que use pigz en lugar de gzip cuando usas algo como tar zcvf ...???
Para no hacer la redirección :)

bye
;)