Utilizando multi core para compactação / descompactação tar + gzip / bzip

225

Eu normalmente comprimo usando tar zcvfe descomprimo usando tar zxvf(usando gzip devido ao hábito).

Recentemente, adquiri uma CPU quad core com hyperthreading, por isso tenho 8 núcleos lógicos e noto que muitos deles não são utilizados durante a compactação / descompactação.

Existe alguma maneira de utilizar os núcleos não utilizados para torná-lo mais rápido?

user1118764
fonte
A solução proposta por Xiong Chiamiov acima funciona perfeitamente. Eu tinha acabado de fazer backup do meu laptop com .tar.bz2 e demorou 132 minutos usando apenas um thread da CPU. Compilei e instalei o tar da fonte: gnu.org/software/tar . Incluí as opções mencionadas na etapa de configuração: ./configure --with-gzip = pigz --with-bzip2 = lbzip2 --with-lzip = plzip Executei o backup novamente e levou apenas 32 minutos. Isso é melhor que a melhoria de 4X! Eu assisti o monitor do sistema e ele manteve todos os 4 cpus (8 threads) nivelados a 100% o tempo todo. Essa é a melhor solução.
amigos estão dizendo sobre warren

Respostas:

309

Você pode usar pigz em vez de gzip, o que compacta o gzip em vários núcleos. Em vez de usar a opção -z, você o canalizaria através do pigz:

tar cf - paths-to-archive | pigz > archive.tar.gz

Por padrão, o pigz usa o número de núcleos disponíveis, ou oito, se não puder consultá-lo. Você pode pedir mais com -pn, por exemplo, -p 32. pigz tem as mesmas opções que o gzip, para que você possa solicitar uma melhor compactação com -9. Por exemplo

tar cf - paths-to-archive | pigz -9 -p 32 > archive.tar.gz
Mark Adler
fonte
3
Como você usa o pigz para descomprimir da mesma maneira? Ou funciona apenas para compactação?
user788171
42
O pigz usa múltiplos núcleos para descompressão, mas apenas com melhorias limitadas em relação a um único núcleo. O formato deflate não se presta à descompressão paralela. A porção de descompressão deve ser feita em série. Os outros núcleos para descompressão pigz são usados ​​para ler, escrever e calcular o CRC. Por outro lado, ao compactar, o pigz se aproxima de um fator de n melhoria com n núcleos.
Mark Adler
7
O hífen aqui é stdout (consulte esta página ).
Garrett
3
Sim. 100% compatível em ambas as direções.
Mark Adler
4
Efetivamente, não há tempo de CPU gasto no processamento, por isso não ajudaria muito. O formato tar é apenas uma cópia do arquivo de entrada com blocos de cabeçalho entre os arquivos.
Mark Adler #
324

Você também pode usar o sinalizador tar "--use-compress-program =" para informar ao tar qual programa de compactação usar.

Por exemplo, use:

tar -c --use-compress-program=pigz -f tar.file dir_to_zip 
Jen
fonte
21
Esta é uma pepita de conhecimento incrível e merece mais votos. Eu não tinha idéia de que essa opção existisse e li a página do manual algumas vezes ao longo dos anos.
Randall caça
2
@ValerioSchiavoni: Aqui não, recebo carga máxima em todos os 4 núcleos (Ubuntu 15.04 'Vivid').
bovender 18/09/15
8
Eu prefiro tar - dir_to_zip | pv | pigz > tar.filepv me ajuda a estimar, você pode pular isso. Mas ainda é mais fácil escrever e lembrar.
Offenso
@ NathanS.Watson-Haigh Sim, você. Apenas coloque o nome do programa e os argumentos entre aspas. man tardiz isso, assim como isso .
Marc.2377
1
Em 2020, zstdé a ferramenta mais rápida para fazer isso. Aceleração notável ao comprimir e descomprimir. Use tar -cf --use-compress-program=zstdmtpara fazer isso com multithreading.
jadelord 5/02
112

Abordagem comum

Há opção para o tarprograma:

-I, --use-compress-program PROG
      filter through PROG (must accept -d)

Você pode usar a versão multithread do arquivador ou utilitário do compressor.

Os arquivadores multithread mais populares são pigz (em vez de gzip) e pbzip2 (em vez de bzip2). Por exemplo:

$ tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 paths_to_archive
$ tar --use-compress-program=pigz -cf OUTPUT_FILE.tar.gz paths_to_archive

O arquivador deve aceitar -d. Se o seu utilitário de substituição não tiver esse parâmetro e / ou você precisar especificar parâmetros adicionais, use pipes (adicione parâmetros, se necessário):

$ tar cf - paths_to_archive | pbzip2 > OUTPUT_FILE.tar.gz
$ tar cf - paths_to_archive | pigz > OUTPUT_FILE.tar.gz

A entrada e a saída de singlethread e multithread são compatíveis. Você pode compactar usando a versão multithread e descompactar usando a versão singlelethread e vice-versa.

p7zip

Para o p7zip para compactação, você precisa de um pequeno script de shell como o seguinte:

#!/bin/sh
case $1 in
  -d) 7za -txz -si -so e;;
   *) 7za -txz -si -so a .;;
esac 2>/dev/null

Salve-o como 7zhelper.sh. Aqui está o exemplo de uso:

$ tar -I 7zhelper.sh -cf OUTPUT_FILE.tar.7z paths_to_archive
$ tar -I 7zhelper.sh -xf OUTPUT_FILE.tar.7z

xz

Em relação ao suporte XZ multithread. Se você estiver executando a versão 5.2.0 ou superior do XZ Utils, poderá utilizar vários núcleos para compactação, definindo -Tou --threadscom um valor apropriado por meio da variável de ambiente XZ_DEFAULTS (por exemplo XZ_DEFAULTS="-T 0").

Este é um fragmento do man para a versão 5.1.0alpha:

A compactação e descompactação multithread ainda não foram implementadas, portanto, esta opção não tem efeito no momento.

No entanto, isso não funcionará para descompactação de arquivos que também não foram compactados com o encadeamento ativado. Do man para a versão 5.2.2:

A descompressão por encadeamento ainda não foi implementada. Ele funcionará apenas em arquivos que contêm vários blocos com informações de tamanho nos cabeçalhos dos blocos. Todos os arquivos compactados no modo multithread atendem a essa condição, mas os arquivos compactados no modo single threaded nem se --block-size = size for usado.

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
Maxim Suslov
fonte
1
Esta é realmente a melhor resposta. Definitivamente vou reconstruir meu alcatrão!
1
Acabei de encontrar pbzip2 e mpibzip2 . O mpibzip2 parece muito promissor para clusters ou se você tem um laptop e um computador de mesa com vários núcleos, por exemplo.
Esta é uma resposta ótima e elaborada. Pode ser bom mencionar que a compactação multithread (por exemplo, com pigz) só é ativada quando se lê do arquivo. O processamento do STDIN pode, de fato, ser mais lento.
oᴉɹǝɥɔ
3
Mais 1 por xzopção. É a abordagem mais simples, porém eficaz.
Selurvedu 26/05
2
export XZ_DEFAULTS="-T 0"antes de chamar tarcom a opção -Jde compactação xz funciona como um encanto.
Scai
13

Você pode usar o atalho -Ipara o --use-compress-programswitch tar e chamar pbzip2a compactação bzip2 em vários núcleos:

tar -I pbzip2 -cf OUTPUT_FILE.tar.bz2 DIRECTORY_TO_COMPRESS/
panticz
fonte
Um bom TL; DR para a resposta de @ MaximSuslov .
einpoklum
Isso retorna tar: home/cc/ziptest: Cannot stat: No such file or directory tar: Exiting with failure status due to previous errors`
Arash
1

Se você deseja ter mais flexibilidade com nomes de arquivos e opções de compactação, pode usar:

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec \
tar -P --transform='s@/my/path/@@g' -cf - {} + | \
pigz -9 -p 4 > myarchive.tar.gz

Passo 1: find

find /my/path/ -type f -name "*.sql" -o -name "*.log" -exec

Este comando procurará os arquivos que você deseja arquivar, neste caso /my/path/*.sqle /my/path/*.log. Adicione quantas -o -name "pattern"quiser.

-execexecutará o próximo comando usando os resultados de find:tar

Passo 2: tar

tar -P --transform='s@/my/path/@@g' -cf - {} +

--transformé um parâmetro simples de substituição de cadeia. Ele removerá o caminho dos arquivos do arquivo, para que a raiz do tarball se torne o diretório atual durante a extração. Observe que você não pode usar a -Copção para alterar o diretório, pois perderá os benefícios de find: todos os arquivos do diretório seriam incluídos.

-Pdiz tarpara usar caminhos absolutos, para que ele não acione o aviso "Removendo` / 'principal dos nomes dos membros ". Os '/' iniciais são removidos de --transformqualquer maneira.

-cf -diz tarpara usar o nome tarball que especificaremos mais tarde

{} +usa todos os arquivos findencontrados anteriormente

Etapa 3: pigz

pigz -9 -p 4

Use quantos parâmetros você desejar. Nesse caso, -9é o nível de compactação e -p 4o número de núcleos dedicados à compactação. Se você executar isso em um servidor da Web carregado, provavelmente não desejará usar todos os núcleos disponíveis.

Etapa 4: nome do arquivo

> myarchive.tar.gz

Finalmente.

Bloops
fonte
0

Uma ferramenta (des) de compactação relativamente mais nova que você pode querer considerar é o zstandard . Ele faz um excelente trabalho na utilização de núcleos sobressalentes e ofereceu ótimas vantagens quando se trata de taxa de compactação vs. tempo de (des) compactação. Também é altamente adaptável, dependendo das necessidades de sua taxa de compactação.

pgebhard
fonte