Estou executando este comando:
pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
Leva muito tempo. Eu olho para os processos com top
. O processo bzip2 leva cerca de 95% e o postgres 5% de um núcleo. A wa
entrada é baixa. Isso significa que o disco não é o gargalo.
O que posso fazer para aumentar o desempenho?
Talvez deixe o bzip2 usar mais núcleos. Os servidores possuem 16 núcleos.
Ou use uma alternativa ao bzip2?
O que posso fazer para aumentar o desempenho?
performance
postgresql
gzip
guettli
fonte
fonte
Respostas:
Existem muitos algoritmos de compactação e
bzip2
é um dos mais lentos. A planíciegzip
tende a ser significativamente mais rápida, geralmente com compressão não muito pior. Quando a velocidade é a mais importante,lzop
é a minha favorita. Má compressão, mas oh, tão rápido.Decidi me divertir e comparar alguns algoritmos, incluindo suas implementações paralelas. O arquivo de entrada é a saída do
pg_dumpall
comando na minha estação de trabalho, um arquivo SQL de 1913 MB. O hardware é um i5 quad-core mais antigo. Os horários são apenas os da hora da compactação. Implementações paralelas estão definidas para usar todos os 4 núcleos. Tabela classificada por velocidade de compressão.Se os 16 núcleos do servidor estiverem inativos o suficiente para que todos possam ser usados para compactação,
pbzip2
provavelmente haverá uma aceleração muito significativa. Mas você ainda precisa de mais velocidade e pode tolerar arquivos ~ 20% maiores,gzip
provavelmente é a sua melhor aposta.Atualização: adicionei
brotli
(consulte a resposta dos TOOGAMs) à tabela.brotli
s definição da qualidade de compressão tem um grande impacto sobre a taxa de compressão e a velocidade, por isso adicionou três configurações (q0
,q1
, eq11
). O padrão éq11
, mas é extremamente lento e ainda pior quexz
.q1
parece muito bom; a mesma taxa de compressão quegzip
, mas 4-5 vezes mais rápido!Atualização: adicionada
lbzip2
(consulte o comentário de gmathts) ezstd
(comentário de Johnny) à tabela e classifique-a pela velocidade de compactação.lbzip2
coloca abzip2
família de volta na corrida comprimindo três vezes mais rápido quepbzip2
com uma ótima taxa de compressão!zstd
também parece razoável, mas é superadobrotli (q1)
tanto na proporção quanto na velocidade.Minha conclusão original de que simples
gzip
é a melhor aposta está começando a parecer quase boba. Embora por onipresença, ele ainda não pode ser batido;)fonte
pg_dumpall
de saída), por isso é provavelmente um pouco mais representativo :)lz4
é um pouco mais rápido e mais eficiente do quelzop
, a propósito. Ele usa mais RAM, o que é relevante em sistemas embarcados.zstd -T4
também. Para configurações muito rápidas, você pode tentarzstd -T4 -1
, comozstd
padrão-3
, que provavelmente é a configuração que você testou.Use pbzip2.
O manual diz:
Ele detecta automaticamente o número de processadores que você possui e cria threads de acordo.
fonte
pixz
epigz
no tubo.lbzip2
parece dar melhor velocidade, uso de memória e compressão marginalmente melhor quepbzip2
. Existem referências aqui: vbtechsupport.com/1614lbzip2
parece bom! Eu adicionei-lo para a minha resposta :)Alguns dados:
Comparação dos algoritmos de compressão Brotli, Deflate, Zopfli, LZMA, LZHAM e Bzip2
CanIUse.com: feature: brotli mostra suporte do Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (mas não o Opera Mini ou o Microsoft Internet Explorer).
Comparação: Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2
-
Se você procura velocidade de compactação, o que procura é quais linhas estão mais à direita neste gráfico. (As entradas na parte superior deste gráfico mostram uma taxa de compactação apertada. Mais alta = mais apertada. No entanto, se a velocidade da compactação for sua prioridade, você deverá prestar mais atenção em quais linhas ficam mais à direita no gráfico.)
Comparação: Taxa de compactação versus velocidade de compactação para métodos Z-7-Zip padrãoVocê não mencionou um sistema operacional. Se o Windows, o 7-Zip com ZStandard (versões) for uma versão do 7-Zip que foi modificada para fornecer suporte para o uso de todos esses algoritmos.
fonte
brotli
antes, mas esqueci. Adicionei-o à tabela de benchmarks na minha resposta! Na verdade, fiquei um pouco decepcionado com o desempenho, exceto na configuração de qualidade 1, na qual ele forneceu a mesma taxa de compactação quegzip
em uma velocidade muito maior.Use zstd . Se é bom o suficiente para o Facebook, provavelmente é bom o suficiente para você também.
Em uma nota mais séria, é realmente muito bom . Eu o uso para tudo agora, porque simplesmente funciona e permite trocar velocidade por proporção em larga escala (na maioria das vezes, a velocidade importa mais do que o tamanho, já que o armazenamento é barato, mas a velocidade é um gargalo).
Em níveis de compactação que atingem compactação geral comparável à do bzip2, é significativamente mais rápido e, se você estiver disposto a pagar um pouco mais no tempo da CPU, quase poderá obter resultados semelhantes ao LZMA (embora seja mais lento que o bzip2). Em taxas de compactação um pouco piores, é muito, muito mais rápido que o bzip2 ou qualquer outra alternativa convencional.
Agora, você está compactando um dump SQL, que é tão embaraçosamente trivial para compactar quanto possível. Até os compressores mais pobres têm uma boa pontuação nesse tipo de dados.
Portanto, você pode executar
zstd
com um nível de compactação mais baixo, que será executado dezenas de vezes mais rápido e ainda alcançará 95-99% da mesma compactação nesses dados.Como bônus, se você fizer isso com frequência e quiser investir um tempo extra, poderá "treinar" o
zstd
compressor com antecedência, o que aumenta a taxa de compressão e a velocidade. Observe que, para que o treinamento funcione bem, você precisará alimentá-lo com registros individuais, não com a coisa toda. Do jeito que a ferramenta funciona, ela espera muitas amostras pequenas e um tanto semelhantes para treinamento, e não uma bolha enorme.fonte
Parece que ajustar (diminuir) o tamanho do bloco pode ter um impacto significativo no tempo de compactação.
Aqui estão alguns resultados do experimento que fiz na minha máquina. Eu usei o
time
comando para medir o tempo de execução.input.txt
é um arquivo de texto de ~ 250mb que contém registros json arbitrários.Usando o tamanho do bloco (maior) padrão (
--best
apenas seleciona o comportamento padrão):Usando o menor tamanho de bloco (
--fast
argumento):Esta foi uma descoberta um tanto surpreendente, considerando que a documentação diz:
fonte