Faz tar | gpg | O bzip2 usa mais memória do que cada passo individualmente?

5

Eu tenho um monte de arquivos que eu rotineiramente preciso tar, criptografar com gpg e, em seguida, comprimir. Isso está em um servidor Linus VPS, então a memória é mais uma consideração do que a velocidade de execução (que eu realmente não me importo).

Se eu fizer as três etapas como um único comando (tar | gpg | bzip2 > output.tar.gpg.bzip2), isso consumirá mais memória do que se eu primeiro chamar tar, então chamar gpg e chamar bzip2?

Os arquivos são potencialmente muito grandes (centenas de megabytes / gigabytes)

    
por raindog 09.04.2011 / 05:45

4 respostas

5

Quanto mais programas rodarem simultaneamente, mais memória será necessária. Mas é uma desvantagem, usar pipes em vez de executar cada programa separadamente tende a exigir menos espaço em disco. Você só precisa de armazenamento para a entrada inicial e saída final. Se você está canalizando através do ssh ou algo similar para armazenar os dados em outro lugar, você pode até não precisar do espaço em disco inicial além do arquivo de entrada. Outro recurso com o uso de pipes é que os dados não são processados em nenhum estágio mais rápido que o estágio mais lento do canal.

O formato OpenPGP que o GnuPG usa suporta a compressão nativamente. Isso acontece antes da criptografia, por isso é mais seguro e muito mais eficiente do que a compactação pós-criptografia. Além disso, ele será detectado automaticamente na descriptografia, para que você não precise se preocupar em adicioná-lo ao pipeline. Ele também pode exigir menos memória do que executar um programa de compactação separado. O GnuPG suporta compactação Zip, Zlib (Gzip) e Bzip2.

    
por 09.04.2011 / 12:06
2

Quando você faz isso ( tar | gpg | bzip2 > output.tar.gpg.bzip2 ) você é comandos piping , isso significa que você está executando todos os comandos ao mesmo tempo e redirecionando as saídas de cada comando para a entrada do comando a seguir ( até a última saída que você redirecionar para o arquivo). Portanto, tar output vai para gpg input que é enviado para bzip2 input que finalmente é enviado para um arquivo.

Então, quando você canaliza, você usa mais memória porque está executando todos os comandos ao mesmo tempo. Você também usa mais poder de processamento, já que gpg e bzip2 são dois programas com fome da CPU.

    
por 09.04.2011 / 05:49
2

Você deve verificar se o bzip2 está fazendo algo que valha a pena com o tamanho, os dados da pgp devem acabar parecendo um fluxo (completamente) aleatório e, portanto, não devem ser realmente compressíveis.

    
por 09.04.2011 / 07:53
1

Todos esses comandos: tar , bzip2 e gpg funcionam de maneira semelhante a um fluxo: eles pegam um dado (digamos um megabyte), o transformam e o empurram para o próximo estágio. Depois disso, a RAM é reutilizada para cuidar de outro bloco de dados. Portanto, mesmo que você tenha um terabyte de dados para processar, ele será processado, peça por peça.

Agora, quando você chamar tar sozinho, o tar funcionará assim: leia um fragmento de dados do disco, envolva-o com alguns cabeçalhos necessários para o arquivamento, empurre-o para o disco e esqueça-o. E de novo. E de novo. Nesse processo, você nunca precisará de mais de um fragmento de dados na RAM. Não sei quão grande será o tar s buffer, mas provavelmente será apenas alguns megabytes. Então, você precisará de apenas alguns megabytes de RAM para que funcione.

gpg e bzip2 funcionam da mesma maneira. gpg pega um pequeno pedaço de dados, criptografa e avança - tudo em um loop. bzip2 pega uma pequena quantidade de dados, compacta e avança - tudo em um loop.

Você precisará de menos RAM se chamar esses comandos sem um pipeline: você precisará manter apenas um bloco de dados ao mesmo tempo na RAM. Com um pipeline, pedaços de dados serão passados de um comando para outro, mantendo-os na RAM: você precisará de alguns fragmentos de dados: um para tar , um para gpg , um para bzip2 . Então, vários megabytes no máximo. Você não precisará de RAM para armazenar todos os dados de uma só vez.

Com o pipelining, você pode obter outro benefício: velocidade. Você não precisa armazenar dados temporários no disco. Pedaços de dados são passados de tar para bzip2 e de bzip2 para gpg usando apenas RAM. Compare: 3 GB de dados, 3 GB de dados em um arquivo tar, 1 GB de dados em um arquivo tar.bzip2, 1 GB de dados em um arquivo tar.bzip2.gpg. Mesmo que você não os armazene ao mesmo tempo (por exemplo, removendo arquivos de origem no processo), ainda é necessário gravar e ler mais 4 GB de dados no disco do que em uma versão de pipeline. E os VPSs geralmente são muito lentos nas operações de disco, portanto, um pipeline pode poupar muito tempo.

(Nota: esta explicação é simplificada. Todos esses comandos mantêm alguns dados adicionais na RAM, mas isso raramente é significativo. Além disso, você pode alterar o tamanho dos buffers em comandos específicos.)

    
por 09.04.2011 / 14:08

Tags