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