Compacta um grande número de arquivos grandes rapidamente

16

Eu tenho cerca de 200 GB de dados de log gerados diariamente, distribuídos em cerca de 150 arquivos de log diferentes.

Eu tenho um script que move os arquivos para um local temporário e faz um tar-bz2 no diretório temporário.

Eu obtenho bons resultados, pois os registros de 200 GB são compactados para cerca de 12 a 15 GB.

O problema é que demora uma eternidade para compactar os arquivos. O trabalho cron é executado diariamente às 2:30 da manhã e continua até às 5:00 - 18:00.

Existe uma maneira de melhorar a velocidade da compactação e concluir o trabalho mais rapidamente? Alguma idéia?

Não se preocupe com outros processos e tudo, o local onde a compactação acontece é em um NAS , e posso executar o NAS em uma VM dedicada e executar o script de compactação a partir dali.

Aqui está a saída do topo para referência:

top - 15:53:50 up 1093 days,  6:36,  1 user,  load average: 1.00, 1.05, 1.07
Tasks: 101 total,   3 running,  98 sleeping,   0 stopped,   0 zombie
Cpu(s): 25.1%us,  0.7%sy,  0.0%ni, 74.1%id,  0.0%wa,  0.0%hi,  0.1%si,  0.1%st
Mem:   8388608k total,  8334844k used,    53764k free,     9800k buffers
Swap: 12550136k total,      488k used, 12549648k free,  4936168k cached
 PID  USER      PR  NI  VIRT  RES  SHR S %CPU %MEM    TIME+  COMMAND
 7086 appmon    18   0 13256 7880  440 R 96.7  0.1 791:16.83 bzip2
7085  appmon    18   0 19452 1148  856 S  0.0  0.0   1:45.41 tar cjvf /nwk_storelogs/compressed_logs/compressed_logs_2016_30_04.tar.bz2 /nwk_storelogs/temp/ASPEN-GC-32459:nkp-aspn-1014.log /nwk_stor
30756 appmon    15   0 85952 1944 1000 S  0.0  0.0   0:00.00 sshd: appmon@pts/0
30757 appmon    15   0 64884 1816 1032 S  0.0  0.0   0:00.01 -tcsh
    
por anu 05.05.2016 / 01:00

5 respostas

23

O primeiro passo é descobrir qual é o gargalo: é E / S de disco, E / S de rede ou CPU?

Se o gargalo é o disco de E / S, não há muito o que fazer. Certifique-se de que os discos não atendam a muitas solicitações paralelas, pois isso só pode diminuir o desempenho.

Se o gargalo for a E / S da rede, execute o processo de compactação na máquina em que os arquivos estão armazenados: executá-lo em uma máquina com uma CPU mais robusta só ajuda se a CPU for o gargalo.

Se o gargalo é a CPU, a primeira coisa a considerar é usar um algoritmo de compactação mais rápido. Bzip2 não é necessariamente uma má escolha - sua principal fraqueza é a velocidade de descompactação - mas você pode usar o gzip e sacrificar algum tamanho pela velocidade de compressão, ou experimentar outros formatos como lzop ou lzma. Você também pode ajustar o nível de compactação: o padrão do bzip2 é -9 (tamanho máximo do bloco, portanto compactação máxima, mas também tempo de compactação mais longo); defina a variável de ambiente BZIP2 para um valor como -3 para testar o nível de compactação 3. Este tópico e este fio discute algoritmos comuns de compressão; em particular esta postagem no blog citada pela derobert fornece alguns valores de referência que sugerem que gzip -9 ou bzip2 com um nível baixo pode ser um bom compromisso em comparação com bzip2 -9 . Esta outra referência que também inclui o lzma (o algoritmo do 7zip, então você pode usar 7z em vez de tar --lzma ) sugere que lzma em um nível baixo pode atingir a taxa de compactação bzip2 mais rapidamente. Qualquer outra opção além do bzip2 irá melhorar o tempo de descompressão. Lembre-se de que a taxa de compactação depende dos dados, e a velocidade de compactação depende da versão do programa de compactação, de como ela foi compilada e da CPU em que ela é executada.

Outra opção, se o gargalo for a CPU e você tiver vários núcleos, é paralelizar a compactação. Existem duas maneiras de fazer isso. Um que funciona com qualquer algoritmo de compactação é compactar os arquivos separadamente (individualmente ou em alguns grupos) e usar parallel para executar os comandos de arquivamento / compactação em paralelo. Isso pode reduzir a taxa de compactação, mas aumenta a velocidade de recuperação de um arquivo individual e funciona com qualquer ferramenta. A outra abordagem é usar uma implementação paralela da ferramenta de compactação; este tópico lista vários.

    
por 05.05.2016 / 02:15
15

Você pode instalar o pigz , o gzip paralelo e usar o tar com a compactação multi-threaded. Como:

tar -I pigz -cf file.tar.gz *

Onde a opção -I é:

-I, --use-compress-program PROG
  filter through PROG

É claro que, se o seu NAS não tiver vários núcleos / CPU potente, você estará limitado de qualquer maneira pelo poder da CPU.

A velocidade do disco rígido / array em que a VM e a compactação estão sendo executadas também pode ser um gargalo.

    
por 05.05.2016 / 01:14
5

De longe, a maneira mais rápida e eficaz de compactar dados é gerar menos deles.

Que tipos de registros você está gerando? 200GB por dia parece bastante (a menos que você seja google ou algum ISP ...), considere que 1MB de texto tem cerca de 500 páginas, então você está gerando o equivalente a 100 milhões de páginas de texto por dia, você Encha a biblioteca do congresso em uma semana.

Veja os dados do seu log se você puder reduzi-lo de alguma forma e ainda conseguir o que precisa dos logs. Por exemplo, diminuindo o nível de log ou usando um formato de log terser. Ou, se você estiver usando os logs para estatísticas, processe as estatísticas on-the-fly e despeje um arquivo com o resumo e, em seguida, filtre os logs antes da compactação para armazenamento.

    
por 06.05.2016 / 10:24
2

Você pode reduzir a quantidade de compactação (em termos de espaço economizado) para torná-lo mais rápido. Para começar, o bzip2 é MUITO mais lento que o gzip, embora ele seja menor. Você também pode alterar o nível de compactação do bzip2, do gzip ou da maioria dos programas de compactação para trocar o tamanho pela velocidade.

Se você não está disposto a negociar o tamanho da velocidade, você ainda pode provavelmente obter o mesmo tamanho ou menor enquanto ainda obtém uma melhoria de velocidade usando um compressor que usa LZMA (xz por exemplo).

Você encontrará referências se pesquisar, mas sua melhor opção é fazer alguns testes com seu próprio arquivo no hardware de destino.

    
por 05.05.2016 / 02:02
2

Se o único requisito for que a compactação seja rápida , recomendamos lz4 altamente.

Ele é usado em muitos lugares onde a velocidade de compactação é mais importante do que a taxa de compactação (por exemplo, sistemas de arquivos com compactação transparente como o ZFS)

    
por 05.05.2016 / 03:09