¿Cuál es la mejor manera de usar bzip2 y gzip paralelos de forma predeterminada?

41

Bzip2 y gzip solo usan un núcleo, aunque muchas computadoras tienen más de un núcleo. Pero hay programas como lbzip2, pbzip2 y pigz, que usan todos los núcleos disponibles y prometen ser compatibles con bzip2 y gzip.

Entonces, ¿cuál es la mejor manera de usar estos programas de forma predeterminada, para que tar cfa file.tar.bz2 directoryuse lbzip2 / pbzip2 en lugar de bzip2? Por supuesto que no quiero romper nada.

elmicha
fuente
2
Por curiosidad para todos: ¿gzip / bzip paralelo es realmente más rápido que el serial? Me imagino que la velocidad de escritura del disco duro y otras restricciones son más un problema.
con-f-use
@ con-f-use No, a menos que tenga SSD teóricamente, podría ser más rápido a medida que aumenta el tamaño total del archivo.
Marco Ceppi
1
En un sistema con 16 cpus, cambiar de gzip a pigz redujo el tiempo a alquitranar 1.2TB y transferirlo a través de la red y probar el resultado de 18 horas de respaldo y 14 horas de prueba a 4 horas de respaldo y 2 horas de prueba. Hay muchos posibles cuellos de botella, velocidad de disco, velocidad de red, potencia de procesamiento, sin embargo, en este caso, esto estaba definitivamente vinculado a la CPU más que a la IO. Este es un sistema de alta gama, sus resultados pueden variar. No es que importe, pero esto fue en RHEL6
cs_alumnus

Respuestas:

32

Puede vincular bzip2, bunzip2 y bzcat a lbzip2, y gzip, gunzip, gzcat y zcat a pigz:

sudo apt-get install lbzip2 pigz
cd /usr/local/bin
ln -s /usr/bin/lbzip2 bzip2
ln -s /usr/bin/lbzip2 bunzip2
ln -s /usr/bin/lbzip2 bzcat
ln -s /usr/bin/pigz gzip
ln -s /usr/bin/pigz gunzip
ln -s /usr/bin/pigz gzcat
ln -s /usr/bin/pigz zcat

Elegí lbzip2 en lugar de pbzip2 porque /usr/share/doc/lbzip2/README.gz parece "más agradable" que /usr/share/doc/pbzip2/README.gz. Además, el manual de alquitrán habla de lbzip2 .

Editar:

pigz-2.1.6, que se incluye en Precise Pangolin, se niega a descomprimir archivos con sufijos desconocidos (por ejemplo, initramfs - *. img). Esto se soluciona en pigz-2.2.4, que se envía con Quantal. Por lo tanto, es posible que desee esperar hasta Quantal, instalar el paquete Quantal manualmente o no vincular gunzip / gzcat / zcat todavía.

elmicha
fuente
77
Esto funciona bien porque / usr / local / bin / viene antes / bin / en $ PATH de la mayoría de las personas. Si algo llama / bin / gunzip directamente o alguien tiene / bin primero en su $ PATH, no usará pigz. Para que esto funcione también para ellos, puede usar dpk-divert y hacer algo así para todos los binarios, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzippero existe la posibilidad de que pigz no sea 100% compatible con todos los indicadores gzip, así que tenga cuidado.
Mark McKinstry
31

La idea del enlace simbólico está realmente bien.
Otra solución de trabajo es alias tar:

alias tar='tar --use-compress-program=pbzip2'

o respectivamente

alias tar='tar --use-compress-program=pigz'

Crea otro tipo de defecto.

Bastian Ebeling
fuente
beneficio adicional: puede usar un alias como 'partar' si desea preservar la funcionalidad original (por alguna razón) ... lamentablemente 'ptar' es tomado por la implementación de Perl
jena
13

La respuesta del enlace simbólico es realmente incorrecta. Reemplazaría el gzip predeterminado (o bzip2) con pigz (o pbzip2) para todo el sistema. Si bien las implementaciones paralelas son notablemente similares a las versiones de un solo proceso, las diferencias sutiles en las opciones de línea de comando podrían romper los procesos centrales del sistema que dependen de esas diferencias.

La opción "--use-compress-program" es una opción mucho mejor. Una segunda opción (al igual que el alias) sería establecer la variable de entorno TAR_OPTIONS compatible con GNU tar:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
usuario154053
fuente
66
He estado usando los enlaces simbólicos desde 2011 ahora y no vi ninguna rotura (aparte del caso mencionado en la edición). Y si no se encuentran e informan tales diferencias sutiles, estaremos atrapados con versiones no paralelas para siempre. Si usa TAR_OPTIONS = "- use-compress-program = pbzip2", no parece que pueda diferenciar entre bzip2 y gzip.
elmicha
Esto no funcionó para mí.
Derek Perkins
3

Una opción fascinante es recompilar tar para usar multiproceso por defecto. Copiado de esta respuesta stackoverflow

Recompilación con reemplazo

Si crea tar desde las fuentes, puede volver a compilar con parámetros

--with-gzip=pigz
--with-bzip2=lbzip2
--with-lzip=plzip

Después de volver a compilar tar con estas opciones, puede consultar el resultado de la ayuda de tar:

$ tar --help | grep "lbzip2\|plzip\|pigz"
  -j, --bzip2                filter the archive through lbzip2
      --lzip                 filter the archive through plzip
  -z, --gzip, --gunzip, --ungzip   filter the archive through pigz
Tom Koch
fuente
-2

Use en sus ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
foo bar
fuente
1
Esto solo funcionará cuando se llame al programa gzip(o gunzip) directamente en la línea de comandos del shell. Otros programas (como tar) no se verán afectados por eso.
Christian Hudon