Comprima um grande número de arquivos grandes rapidamente

16

Eu tenho cerca de 200 GB de dados de log gerados diariamente, distribuídos entre 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 logs de 200 GB são compactados para cerca de 12 a 15 GB.

O problema é que leva uma eternidade para compactar os arquivos. O cron trabalho é executado às 2:30 da manhã diário e continua a correr até 5: 00-6: 00.

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

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

Aqui está a saída do top 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
anu
fonte
2
Se você tiver várias CPUs e tiver ou puder dividi-lo em vários arquivos tar, poderá executar várias compressões.
Jeff Schaller
@JeffSchaller seria possível obter vários processos bzip2 compactando arquivos diferentes, mas gravando no mesmo tar.bz2arquivo?
anu
2
Os arquivos de log são gerados no disco local antes de passar para o NAS? Se for o caso, comprima e mova-se; dessa forma, você está enviando apenas 15 GB de dados pela rede, em vez de 100 (mover) e 115 (100 leitura + 15 gravação) ao compactar. Como alternativa, parece que você pode estar ligado à CPU nesse processo bzip2, portanto, executar vários em paralelo (um por CPU) pode ajudar (até atingir o limite de E / S). Ou use uma compactação mais simples (por exemplo, "gzip -1"). Não economizará muito espaço em disco, mas será executado mais rapidamente.
Stephen Harris
@Sukminder Definitivamente vou tentar isso e ver a diferença de tamanho. Obrigado.
anu
Sua topsaída mostra que seu bzip2processo single-threaded está maximizando um núcleo, mas que você está executando em um sistema quad-core (um processo usando 100% da CPU -> 25.1%tempo da CPU no espaço do usuário, 74% ocioso). Portanto, com pequenas alterações, você pode ir 4x mais rápido, a menos que outra coisa se torne um gargalo. Leia a resposta de Gilles com atenção. Considere usar a CPU na mesma caixa que os discos que contêm os dados para fazer a compactação. (Você pode até comprimir alguns de seus arquivos em uma caixa, outros por outro, e arquivar depois, para que ambos os CPUs são utilizados.)
Peter Cordes

Respostas:

25

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

Se o gargalo for a E / S do disco, não há muito o que fazer. Verifique se os discos não atendem 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 for a CPU, a primeira coisa a considerar é usar um algoritmo de compactação mais rápido. O Bzip2 não é necessariamente uma má escolha - sua principal fraqueza é a velocidade de descompressão - mas você pode usar o gzip e sacrificar algum tamanho pela velocidade de compactação ou experimentar outros formatos, como lzop ou lzma. Você também pode ajustar o nível de compactação: o padrão bzip2 é -9(tamanho máximo do bloco, compactação máxima, mas também tempo de compactação mais longo); defina a variável de ambiente BZIP2com um valor semelhante -3ao de tentar o nível de compactação 3. Esse encadeamento e esse encadeamento discutem algoritmos comuns de compactação; em particular, este post de blog citado por derobert fornece alguns benchmarks que sugerem que gzip -9oubzip2com um nível baixo pode ser um bom compromisso em comparação com bzip2 -9. Esse outro benchmark que também inclui lzma (o algoritmo de 7zip, então você pode usar em 7zvez de tar --lzma) sugere que lzmaem um nível baixo pode atingir a taxa de compactação bzip2 mais rapidamente. Praticamente qualquer escolha que não seja o bzip2 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 foi compilado e da CPU em que é executado.

Outra opção, se o gargalo for a CPU e você tiver vários núcleos, será paralelizar a compactação. Existem duas maneiras de fazer isso. Um que funcione com qualquer algoritmo de compactação é compactar os arquivos separadamente (individualmente ou em alguns grupos) e usar parallelpara 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.

Gilles 'SO- parar de ser mau'
fonte
4
"Se o gargalo é a E / S do disco, não há muito o que fazer." Provavelmente isso é verdade aqui, já que a taxa de compactação já é boa, mas em geral quando E / S é o gargalo, pode valer a pena usar mais CPU para obter uma melhor taxa de compactação (usando configurações de compactação diferentes ou um algoritmo diferente). .. você não pode realmente reduzir o "I" (porque você precisa ler em todos os dados), mas às vezes você pode reduzir significativamente o "o" :-)
psmears
11
Se você pedir 7zpara não criar um arquivo "sólido" ou limitar o tamanho dos blocos "sólidos", ele executará vários segmentos LZMA em paralelo, IIRC. Os dados do arquivo de log são um caso especial para compactação, porque tendem a ser altamente redundantes (muita semelhança entre linhas). Definitivamente vale a pena testar gzip, bzip2e xznos arquivos de log específicos do OP, em vez de apenas olhar para os benchmarks de compactação genéricos para descartar qualquer opção. Mesmo compressores rápidos valem a pena considerar ( lzop, lz4, snappy).
Peter Cordes 5/05
O compressor LZMA preferido hoje em dia é xz. Use tar -Jou --xz, não --lzma. .lzmaé considerado um formato de arquivo "legado" . As múltiplas iterações de formatos de arquivo para compactação LZMA são um pouco embaraçosas, e algo que elas deveriam ter acertado na primeira vez. Mas o AFAIK é basicamente bom agora e o .xz não está prestes a ser substituído por outro formato de arquivo para o mesmo fluxo de compactação.
Peter Cordes
O 7z possui excelente compactação e multi-threading, mas por causa do formato de arquivo (precisa de um índice ou talvez de bugs?) Eu não acho que ele possa ser usado no meio de um pipeline - ele não usará stdin e stdout ao mesmo tempo
Xen2050 5/05
Isso foi realmente útil e perspicaz. Minha equipe achou que a operação no NFS era um grande gargalo.
anu
16

Você pode instalar pigz, gzip paralelo e usar tar com a compactação multithread. Gostar:

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

Onde a -Iopção é:

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

Obviamente, se o seu NAS não tiver vários núcleos / CPU poderosa, você estará limitado pela potência da CPU.

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

mazs
fonte
11
E se você deseja usar o bzip2, pode usar pbzip2ou lbzip2.
Radovan Garabík 5/05
2
Esta é a sua melhor resposta. Mas primeiro, verifique se sua primeira mudança é para um local que esteja no mesmo sistema de arquivos que os arquivos originais. Caso contrário, seu "movimento" é realmente um byte-copy-then-delete. No mesmo sistema de arquivos, uma movimentação é uma reorganização dos links do sistema de arquivos. São ordens de magnitude mais rápidas. Para meus arquivos de log com centenas de Gigabytes de tamanho, pigz fez toda a diferença. Você pode dizer quantos threads paralelos executar. Enquanto o seu processador tiver vários núcleos, eu não gastaria muito tempo investigando. Você provavelmente vai querer pigz em qualquer caso; você pode obter sua aceleração imediatamente.
Mike S
Depois de digitar, observe as saídas htop e iostat e observe o desempenho do sistema, se você quiser investigar melhor o sistema. Mais uma vez, não tentarei mais compactar arquivos grandes sem o pigz. Em um sistema multicore moderno, é bobagem não usá-lo. É uma vitória tão imediata - você verá.
Mike S
7

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

Que tipos de logs você está gerando? Os 200 GB diários parecem bastante (a menos que você seja o Google ou algum ISP ...), considere que 1 MB de texto é de cerca de 500 páginas; portanto, você está gerando o equivalente a 100 milhões de páginas de texto por dia; encha a biblioteca do congresso em uma semana.

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

Emily L.
fonte
11
Esta é uma solução filosófica interessante. A solução da maioria dos problemas da vida é evitar o problema completamente, não é? Isso até examinarmos de perto a sugestão e percebermos que existem centenas de pessoas e milhares de aprovações que precisamos passar para conseguir isso.
anu
11
@anu Nenhum contexto para a pergunta foi dado, então eu não assumi nenhum. E você poderia me dizer de onde obteve o número 1000 de aprovações? Para mim, parece que você acabou de inventar.
Emily L.
Eu vou votar isso. Essa é a solução de destaque muitas vezes esquecida, mas uma vez observada, para muitos dos problemas da vida.
jrw32982 suporta Monica
11
Bem ... agora que não trabalho mais lá, posso divulgar pelo menos que este era um problema na Apple. Mais especificamente, na pilha de serviços que atende a loja de aplicativos on-line ... então sim, milhares de aprovações são uma realidade, porque eles têm milhares de microsserviços e cada um deles produz logs que precisam ser compactados e terão que assinar sua alteração logging levels etc ... Enfim ... descobrimos uma solução para essa btw interna ... que é praticamente equivalente ao gzip paralelo que é descarregado em outros microsserviços.
anu
3

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

Se você não estiver disposto a trocar o tamanho da velocidade, provavelmente ainda poderá 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 aposta é fazer alguns testes com seu próprio arquivo no hardware de destino.

EricS
fonte
3

Se o único requisito é que a compactação seja rápida , recomendo muito o lz4 .

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

pdo
fonte
Nunca ouvi falar disso antes, existe um programa que provavelmente já esteja instalado em praticamente todos os lugares que o usa, como o xz?
Xen2050 05/05