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 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 bzip2 usar mais núcleos. Os servidores tem 16 núcleos.
Ou usar uma alternativa ao bzip2?
O que posso fazer para aumentar o desempenho?
Existem muitos algoritmos de compressão por aí, e
bzip2
é um dos mais lentos. A planíciegzip
tende a ser significativamente mais rápida, geralmente com uma compressão não muito pior. Quando a velocidade é o mais importante,lzop
é o meu favorito. 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 tempos são tempos de relógio de parede apenas da compressão. As implementações paralelas são definidas para usar todos os 4 núcleos. Tabela classificada por velocidade de compressão.Se os 16 núcleos do seu servidor estiverem ociosos o suficiente para que todos possam ser usados para compactação,
pbzip2
provavelmente você terá uma aceleração muito significativa. Mas você precisa de mais velocidade ainda e pode tolerar arquivos ~ 20% maiores,gzip
provavelmente é sua melhor aposta.Atualização: adicionei
brotli
(veja a resposta do TOOGAMs) resultados à tabela.brotli
A configuração de qualidade de compactação tem um impacto muito grande na taxa de compactação e na velocidade, então adicionei 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: Adicionado
lbzip2
(ver comentário gmathts) ezstd
(comentário de Johnny) à tabela, e ordenado por velocidade de compressão.lbzip2
coloca abzip2
família de volta na corrida, comprimindo três vezes mais rápido do quepbzip2
com uma ótima taxa de compressão!zstd
também parece razoável, mas é superadobrotli (q1)
em proporção e velocidade.Minha conclusão original de que simples
gzip
é a melhor aposta está começando a parecer quase boba. Embora por onipresença, ainda não pode ser superado;)Use pbzip2.
O manual diz:
Ele detecta automaticamente o número de processadores que você possui e cria threads de acordo.
Alguns dados:
Comparação dos Algoritmos de Compressão Brotli, Deflate, Zopfli, LZMA, LZHAM e Bzip2
CanIUse.com: recurso: brotli mostra suporte para Microsoft Edge, Mozilla Firefox, Google Chrome, Apple Safari, Opera (mas não Opera Mini ou Microsoft Internet Explorer).
Comparação: Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2
-
Se você está procurando velocidade de compressão, então o que você está procurando é quais linhas estão mais à direita neste gráfico. (As entradas na parte superior deste gráfico mostram uma taxa de compactação apertada. Maior = mais apertada. No entanto, se a velocidade de compactação for sua prioridade, você deverá prestar mais atenção às linhas que chegam mais à direita no gráfico.)
Comparação: taxa de compactação versus velocidade de compactação para métodos 7-Zip ZStandardVocê não mencionou um sistema operacional. Se o Windows, 7-Zip com ZStandard (Releases) for uma versão do 7-Zip que foi modificada para fornecer suporte ao uso de todos esses algoritmos.
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 ele simplesmente funciona e permite que você troque velocidade por proporção em grande 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 uma compactação geral comparável ao bzip2, é significativamente mais rápido e, se você estiver disposto a pagar um pouco
mais de tempo de CPU, poderá obter resultados semelhantes ao LZMA (embora seja mais lento que o bzip2). Com taxas de compressã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. Mesmo os compressores mais fracos pontuam bem nesse tipo de dados.
Assim, você pode executar
zstd
com um nível de compactação mais baixo, o que será executado dezenas de vezes mais rápido e ainda atingirá 95-99% da mesma compactação nesses dados.Como bônus, se você fizer isso com frequência e quiser investir algum 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. A maneira como a ferramenta funciona, ela espera muitas amostras pequenas e um pouco semelhantes para treinamento, e não um blob enorme.Parece que ajustar (reduzir) 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. Usei o
time
comando para medir o tempo de execução.input.txt
é um arquivo de texto de ~250mb contendo registros json arbitrários.Usando o tamanho de bloco padrão (maior) (
--best
apenas seleciona o comportamento padrão):Usando o menor tamanho de bloco (
--fast
argumento):Esta foi uma descoberta um pouco surpreendente, considerando que a documentação diz: