Acelerando a compactação com tar e pigz
Envie um arquivo tar sem compressão por pipe ao pigz para compactar um projeto usando vários
núcleos de CPU. O resultado é um arquivo .tar.gz comum, que os destinatários podem extrair com gzip e tar,
sem instalar o pigz. O passo a passo abaixo cria esse arquivo compactado, exclui logs e compara o
arquivo restaurado com o original.
Confira as ferramentas
Use Bash e GNU tar no Linux. Os exemplos foram testados com GNU tar 1.34, pigz 2.6 e Bash 5.1 no Ubuntu 22.04, e com GNU tar 1.35, pigz 2.8 e Bash 5.3 no Ubuntu 26.04. No Ubuntu ou Debian, instale o pigz com:
sudo apt-get update && sudo apt-get install pigz
Confira as versões instaladas antes de continuar:
bash --version && tar --version && pigz --version && gzip --version
Os comandos abaixo são voltados para esses ambientes GNU/Linux. O macOS inclui uma implementação diferente do tar, e a disponibilidade de pacotes em outras distribuições Linux varia; a configuração nesses sistemas está fora do escopo deste passo a passo.
Crie um projeto pequeno
Execute os blocos a seguir na mesma sessão do Bash. Comece em um diretório onde você possa criar um
novo diretório pigz-demo:
mkdir pigz-demo &&
cd pigz-demo &&
mkdir project &&
printf 'Keep this project file.\n' > project/README.txt &&
printf 'Omit this debug log.\n' > project/debug.log
A cadeia && é interrompida se a configuração falhar. Se pigz-demo já existir, escolha outro local;
este bloco se recusa deliberadamente a reutilizá-lo. Agora você deve estar dentro de pigz-demo, com dois
arquivos em project/.
Compacte o projeto
Execute este bloco completo, incluindo os parênteses:
(
set -e
set -o pipefail
set -o noclobber
tar --exclude='*.log' -cf - project | pigz -p 4 -6 > project.tar.gz
printf 'Created project.tar.gz\n'
)
Aqui, tar -c reúne o diretório, e -f - grava o arquivo tar na saída padrão. O pigz
compacta esse fluxo com até quatro threads de compactação no nível seis, o nível padrão dele. Mantenha
project.tar.gz fora de project/ para que o arquivo compactado não possa incluir a própria saída. Não adicione a flag
-z do tar aqui: isso compactaria o fluxo antes que ele chegasse ao pigz.
A política de saída é recusar um arquivo compactado existente. A opção noclobber do Bash impede que o
redirecionamento substitua um arquivo regular existente, inclusive em uma nova execução não interativa.
Para manter outro arquivo compactado, escolha um novo nome de saída. Os parênteses limitam essas
opções do shell a esta operação.
Com pipefail, uma falha no tar ou no pigz faz o pipeline falhar; em seguida, set -e interrompe o
bloco antes da mensagem de sucesso. Caso contrário, o pigz poderia compactar com sucesso um fluxo
incompleto vindo de um comando tar que falhou. Uma execução com falha pode deixar um project.tar.gz parcial;
não o use, mesmo que ele passe em uma verificação de integridade do gzip. Investigue o erro e escolha
um novo nome de saída antes de tentar novamente. Consulte a
documentação do Bash sobre pipelines e opções do shell.
Escolha o que deixar de fora
O padrão --exclude='*.log' entre aspas exclui logs dentro do diretório do projeto, incluindo
project/debug.log. As aspas fazem com que o tar interprete o curinga, em vez do shell. Remova essa
opção se os logs precisarem fazer parte do seu arquivo compactado. Para mais exclusões, o GNU tar
aceita opções --exclude repetidas ou --exclude-from com um padrão por linha em um arquivo. Esses são
padrões no estilo do shell, não expressões regulares; consulte a
documentação de exclusão do GNU tar.
Verifique e restaure o arquivo compactado
Depois de uma criação bem-sucedida, verifique o fluxo gzip e liste os membros do arquivo compactado:
gzip -t project.tar.gz && tar -tzf project.tar.gz
Um gzip -t bem-sucedido não imprime nada. Para o projeto de exemplo, o tar imprime em seguida:
project/
project/README.txt
Essas verificações respondem a perguntas diferentes: o gzip testa a integridade dos dados compactados, enquanto a listagem permite conferir quais caminhos foram arquivados. Nenhuma delas prova que todos os arquivos de origem pretendidos foram capturados. O manual do gzip documenta o teste de integridade dele.
Extraia para um novo diretório e compare o arquivo restaurado com o original:
mkdir restored &&
tar -xzf project.tar.gz -C restored &&
cmp project/README.txt restored/project/README.txt &&
printf 'Restored README.txt matches the original.\n'
A mensagem final aparece somente se a extração e a comparação byte a byte forem bem-sucedidas. O
mkdir inicial recusa um diretório restored existente, então executar este bloco novamente não pode
sobrescrever uma restauração anterior. Se a extração falhar, examine o erro e use um novo destino na
próxima tentativa. Em um projeto real, compare os arquivos que você precisa recuperar, não apenas o
README de exemplo.
Escolha o número de threads e o nível de compactação
Comece com -6. Experimente -1 quando o tempo de compactação importar mais do que o tamanho, ou
-9 quando você puder gastar mais tempo de CPU tentando reduzir a saída. Aumentar o nível não
significa compactação mais rápida. Sem -p, o pigz usa por padrão o número de processadores online;
um limite explícito é útil em uma máquina que está fazendo outros trabalhos. Essas configurações são
descritas no manual do pigz.
O pequeno exemplo acima verifica a correção, não a velocidade. Quando você tiver um projeto representativo e inalterado, compare uma e quatro threads de compactação no mesmo nível:
(
set -e
set -o pipefail
for threads in 1 4; do
printf 'Compression threads: %s\n' "$threads"
time tar --exclude='*.log' -cf - project | pigz -p "$threads" -6 > /dev/null
done
)
O time do Bash mede o pipeline inteiro; compare os tempos decorridos de real. Isso descarta a
saída compactada, então mede a leitura e a compactação sem gravar um arquivo compactado em disco.
Repita com seus próprios dados: cache do sistema de arquivos, CPUs disponíveis, throughput de
armazenamento e arquivos já compactados podem alterar o resultado. Não há um ganho de velocidade
fixo a esperar.
O pigz paraleliza a compactação, mas a descompactação gzip comum ainda usa uma thread de descompactação, com threads auxiliares para leitura, escrita e checksums. Não espere o mesmo ganho de escala ao extrair. O manual do pigz explica essa distinção.
Use o arquivo compactado em uma tarefa de backup
Antes de arquivar um projeto real, interrompa os processos que alteram os arquivos dele ou arquive um snapshot do sistema de arquivos. O tar não transforma um diretório em uso em um backup consistente de um ponto no tempo. Para uma tarefa agendada, use caminhos absolutos, dê a cada execução um novo nome de saída e mantenha as verificações de falha antes de transferir ou dividir o resultado.
Esse fluxo de trabalho cria um arquivo compactado local completo. Cadeias de backup incremental, transferências por SSH e arquivos compactados divididos precisam de tratamento de falhas e procedimentos de restauração próprios. Mantenha o último backup reconhecidamente válido até verificar o novo arquivo compactado e os arquivos que você precisa recuperar.
