gzip en paralelo con pigz

pigz (parallel implementation of gzip) es el sustituto perfecto de gzip en sistemas multi-procesador y multi-core ya que permite lanzar varias instancias en paralelo para un único proceso de compresión, aprovechando la capacidad de CPU de los cores que estimemos necesario.

El creador de Pigz es Mark Adler y usa zlib y librerías pthread. Para instalarlo lo compilamos del siguiente modo:

$ wget http://zlib.net/pigz/pigz-2.3.1.tar.gz
$ tar -xzvf pigz-2.3.1.tar.gz
$ make
$ sudo cp pigz unpigz  /usr/local/bin/

Ya podemos ejecutarlo y visualizar toda la ayuda de parámetros disponibles:

$ pigz 
Usage: pigz [options] [files ...]
  will compress files in place, adding the suffix '.gz'.  If no files are
  specified, stdin will be compressed to stdout.  pigz does what gzip does,
  but spreads the work over multiple processors and cores when compressing.

Options:
  -0 to -9, -11        Compression level (11 is much slower, a few % better)
  --fast, --best       Compression levels 1 and 9 respectively
  -b, --blocksize mmm  Set compression block size to mmmK (default 128K)
  -c, --stdout         Write all processed output to stdout (won't delete)
  -d, --decompress     Decompress the compressed input
  -f, --force          Force overwrite, compress .gz, links, and to terminal
  -F  --first          Do iterations first, before block split for -11
  -h, --help           Display a help screen and quit
  -i, --independent    Compress blocks independently for damage recovery
  -I, --iterations n   Number of iterations for -11 optimization
  -k, --keep           Do not delete original file after processing
  -K, --zip            Compress to PKWare zip (.zip) single entry format
  -l, --list           List the contents of the compressed input
  -L, --license        Display the pigz license and quit
  -M, --maxsplits n    Maximum number of split blocks for -11
  -n, --no-name        Do not store or restore file name in/from header
  -N, --name           Store/restore file name and mod time in/from header
  -O  --oneblock       Do not split into smaller blocks for -11
  -p, --processes n    Allow up to n compression threads (default is the
                       number of online processors, or 8 if unknown)
  -q, --quiet          Print no messages, even on error
  -r, --recursive      Process the contents of all subdirectories
  -R, --rsyncable      Input-determined block locations for rsync
  -S, --suffix .sss    Use suffix .sss instead of .gz (for compression)
  -t, --test           Test the integrity of the compressed input
  -T, --no-time        Do not store or restore mod time in/from header
  -v, --verbose        Provide more verbose output
  -V  --version        Show the version of pigz
  -z, --zlib           Compress to zlib (.zz) instead of gzip format
  --                   All arguments after "--" are treated as files

La opción más importante que debemos conocer es la que nos permite especificar el número de procesos a levantar para la compresión:

-p --processes n
Allow up to n processes (default is the number of online processors)

Sobre todo tened en cuenta que por defecto utilizará todos los cores y procesadores de la máquina para la compresión del fichero, así que es recomendable especificar un número, normalmente haremos pruebas de menos a más hasta llegar al número de procesos adecuado para nuestro sistema que no sature el IO. Cada core que utilicemos ya sabemos que se va a poner al 100% de tiempo de CPU.

Ejemplo de compresión del fichero «test.log» a «test.log.gz» con 4 procesos (4 cores):

$ pigz -p 4 test.log

Por supuesto también tenemos la opción de descompresión usando varios procesos:

  -d, --decompress     Decompress the compressed input

4 comentarios en “gzip en paralelo con pigz

  1. Pigz lo usa plesk en su nuevo sistema de backups, lo cierto es que es más eficiente, no hay mejoras en compresión ni nada como dicen algunos, es el mismo gzip pero multi thread, el problema es que va muy rápido y algunos servidores tienen problemas de carga si tienen discos duros lentos o mucha carga por ese lado.

    En mi caso he hecho unos test y la velocidad es bastante buena, mejora mucho en un SSD va muy bien, pero al menos lo que es en servidores muy cargados con plesk aveces es una tortura las altas cargas :/

    Es muy buen consejo lo de especificar el número de cores a usar, por mi parte sigo usando gzip.

    *** importante sería agregar al post que el modo -r recursivo no comprime carpetas, o sea no equivalente a un tar -xz nombre.tar.gz cargpeta/, si no que el -r lo que hace es entrar a la carpeta y comprimir todos los archivos o sea, comprime archivo por archivo creando un .gz de cada uno, lo mismo que usar gzip directamente sin tar.

    Por lo tanto habría que usar primero tar para empaquetar una carpeta y luego pigz.

Comments are closed.