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
tar.bz2
arquivo?top
saída mostra que seubzip2
processo 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.)Respostas:
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 ambienteBZIP2
com um valor semelhante-3
ao 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 quegzip -9
oubzip2
com um nível baixo pode ser um bom compromisso em comparação combzip2 -9
. Esse outro benchmark que também inclui lzma (o algoritmo de 7zip, então você pode usar em7z
vez detar --lzma
) sugere quelzma
em 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
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.fonte
7z
para 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 testargzip
,bzip2
exz
nos 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
).xz
. Usetar -J
ou--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.Você pode instalar
pigz
, gzip paralelo e usar tar com a compactação multithread. Gostar:Onde a
-I
opção é: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.
fonte
pbzip2
oulbzip2
.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.
fonte
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.
fonte
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)
fonte