Qual é a melhor maneira de usar bzip2 e gzip paralelos por padrão?

41

Bzip2 e gzip usam apenas um núcleo, embora muitos computadores tenham mais de um núcleo. Mas existem programas como lbzip2, pbzip2 e pigz, que usam todos os núcleos disponíveis e prometem ser compatíveis com bzip2 e gzip.

Então, qual é a melhor maneira de usar esses programas por padrão, de modo que tar cfa file.tar.bz2 directoryuse lbzip2 / pbzip2 em vez de bzip2? Claro que não quero quebrar nada.

elmicha
fonte
2
Por curiosidade para todos: o gzip / bzip paralelo é realmente mais rápido que o serial? Imagino que a velocidade de gravação do disco rígido e outras restrições sejam mais um problema.
con-f-use
@ con-f-use Não, a menos que você tenha SSDs teoricamente, poderá ser mais rápido à medida que o tamanho total do arquivo aumentar.
Marco Ceppi
1
Em um sistema com 16 cpus, a mudança de gzip para pigz reduziu o tempo para tar 1.2 TB e transferi-lo pela rede e testar o resultado de 18 horas de backup e 14 horas de teste para 4 horas de backup e 2 horas de teste. Existem muitos gargalos em potencial, velocidade do disco, velocidade da rede, poder de processamento, no entanto, neste caso, isso foi definitivamente vinculado à CPU mais do que à IO. Este é um sistema avançado, seus resultados podem variar. Não que isso importe, mas esta foi em RHEL6
cs_alumnus

Respostas:

32

Você pode vincular bzip2, bunzip2 e bzcat a lbzip2 e gzip, gunzip, gzcat e 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

Eu escolhi o lbzip2 em vez do pbzip2 porque o /usr/share/doc/lbzip2/README.gz parece "melhor" do que o /usr/share/doc/pbzip2/README.gz. Além disso, o alcatrão manuais fala sobre lbzip2 .

Editar:

O pigz-2.1.6, incluído no Precise Pangolin, se recusa a descomprimir arquivos com sufixos desconhecidos (por exemplo, initramfs - *. img). Isso é corrigido no pigz-2.2.4, fornecido com o Quantal. Portanto, você pode esperar até Quantal, instalar o pacote Quantal manualmente ou não vincular gunzip / gzcat / zcat ainda.

elmicha
fonte
7
Isso funciona bem porque / usr / local / bin / vem antes / bin / no $ PATH da maioria das pessoas. Se algo chamar / bin / gunzip diretamente ou alguém tiver / bin primeiro em seu $ PATH, eles não usarão pigz. Para fazer isso funcionar para eles também, você pode usar o dpk-desv e fazer algo assim para todos os binários, sudo dpkg-divert --divert /bin/gunzip.orig --rename /bin/gunzip; sudo ln -s /usr/bin/pigz /bin/gunzipmas existe a possibilidade de o pigz não ser 100% compatível com todos os sinalizadores gzip, portanto, tenha cuidado.
Mark McKinstry
31

A idéia do link simbólico é muito boa.
Outra solução de trabalho é alias tar:

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

ou respectivamente

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

Ele cria outro tipo de padrão.

Bastian Ebeling
fonte
benefício adicional: você pode usar apelido como 'partar' se você quiser preservar a funcionalidade original (por alguma razão) .. infelizmente 'PTAR' é tomado por aplicação perl
Jena
13

A resposta do link simbólico está realmente incorreta. Substituiria o gzip padrão (ou bzip2) por pigz (ou pbzip2) para todo o sistema. Embora as implementações paralelas sejam notavelmente semelhantes às versões de processo único, diferenças sutis nas opções de linha de comando podem interromper os processos principais do sistema que dependem dessas diferenças.

A opção "--use-compress-program" é uma opção muito melhor. Uma segunda opção (assim como o alias) seria definir a variável de ambiente TAR_OPTIONS suportada pelo GNU tar:

$ export TAR_OPTIONS = "- use-compress-program = pbzip2"
$ tar czf myfile.tar.bz2 mysubdir /
user154053
fonte
6
Estou usando os links simbólicos desde 2011 e não vi nenhuma quebra (além do caso mencionado na edição). E se essas diferenças sutis não forem encontradas e relatadas, ficaremos presos a versões não paralelas para sempre. Se você usa TAR_OPTIONS = "- use-compress-program = pbzip2", não parece que você pode diferenciar entre bzip2 e gzip.
Elmicha
Isso não funcionou para mim.
Derek Perkins
3

Uma opção fascinante é recompilar o tar para usar multithread por padrão. Copiado desta resposta stackoverflow

Recompilar com substituição

Se você criar tar a partir de fontes, poderá recompilar com parâmetros

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

Após recompilar o tar com essas opções, você pode verificar a saída da ajuda do 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
fonte
-2

Use em suas ~ / .bash_aliases:

alias gzip="pigz"
alias gunzip="unpigz"
foo bar
fonte
1
Isso funcionará apenas ao chamar o programa gzip(ou gunzip) diretamente na linha de comando do shell. Outros programas (como tar) não serão afetados por isso.
Christian Hudon