私はこのコマンドを実行しています:
pg_dumpall | bzip2 > cluster-$(date --iso).sql.bz2
時間がかかりすぎます。 top
でプロセスを確認します。 bzip2プロセスは、1つのコアの約95%とpostgres 5%を占めます。 wa
エントリが少なくなっています。これは、ディスクがボトルネックではないことを意味します。
パフォーマンスを向上させるにはどうすればよいですか?
多分bzip2にもっと多くのコアを使わせてください。サーバーには16コアがあります。
またはbzip2の代替を使用しますか?
パフォーマンスを向上させるにはどうすればよいですか?
周りには多くの圧縮アルゴリズムがあり、_bzip2
_は遅いアルゴリズムの1つです。プレーンgzip
は、通常はそれほど悪くない圧縮で、かなり高速になる傾向があります。速度が最も重要な場合、lzop
が私のお気に入りです。圧縮率は低いですが、非常に高速です。
私はいくつかの楽しみを持ち、並列実装を含むいくつかのアルゴリズムを比較することにしました。入力ファイルは、私のワークステーションでの_pg_dumpall
_コマンドの出力、1913 MBのSQLファイルです。ハードウェアは古いクアッドコアi5です。時間は、圧縮のみの実時間です。並列実装は、4つのコアすべてを使用するように設定されています。圧縮速度で並べ替えられたテーブル。
_Algorithm Compressed size Compression Decompression
lzop 398MB 20.8% 4.2s 455.6MB/s 3.1s 617.3MB/s
lz4 416MB 21.7% 4.5s 424.2MB/s 1.6s 1181.3MB/s
brotli (q0) 307MB 16.1% 7.3s 262.1MB/s 4.9s 390.5MB/s
brotli (q1) 234MB 12.2% 8.7s 220.0MB/s 4.9s 390.5MB/s
zstd 266MB 13.9% 11.9s 161.1MB/s 3.5s 539.5MB/s
pigz (x4) 232MB 12.1% 13.1s 146.1MB/s 4.2s 455.6MB/s
gzip 232MB 12.1% 39.1s 48.9MB/s 9.2s 208.0MB/s
lbzip2 (x4) 188MB 9.9% 42.0s 45.6MB/s 13.2s 144.9MB/s
pbzip2 (x4) 189MB 9.9% 117.5s 16.3MB/s 20.1s 95.2MB/s
bzip2 189MB 9.9% 273.4s 7.0MB/s 42.8s 44.7MB/s
pixz (x4) 132MB 6.9% 456.3s 4.2MB/s 7.9s 242.2MB/s
xz 132MB 6.9% 1027.8s 1.9MB/s 17.3s 110.6MB/s
brotli (q11) 141MB 7.4% 4979.2s 0.4MB/s 3.6s 531.6MB/s
_
サーバーの16コアが十分にアイドル状態にあり、すべてを圧縮に使用できる場合、_pbzip2
_を使用すると、速度が大幅に向上します。ただし、さらに速度が必要で、20%までの大きなファイルを許容できます。gzip
がおそらく最善の策です。
pdate:brotli
(TOOGAMの回答を参照)の結果を表に追加しました。 brotli
s圧縮品質設定は、圧縮率と速度に非常に大きな影響を与えるため、3つの設定(_q0
_、_q1
_、および_q11
_)を追加しました。デフォルトは_q11
_ですが、非常に低速であり、xz
よりもさらに悪いです。 _q1
_は非常によく見えます。 gzip
と同じ圧縮率ですが、4〜5倍高速です。
pdate: _lbzip2
_(gmathtsコメントを参照)とzstd
(Johnnyのコメントを参照)をテーブルに追加し、圧縮速度でソートしました。 _lbzip2
_は、_bzip2
_ファミリーを_pbzip2
_の3倍の速さで圧縮し、高い圧縮率で実行に戻します! zstd
も適切に見えますが、比率と速度の両方でbrotli (q1)
に勝っています。
プレーンgzip
が最善の策であるという私の最初の結論は、ほとんどばかげているように見え始めています。ユビキタスのために、それはまだ打つことはできません;)
Pbzip2を使用します。
manual は言う:
pbzip2は、pthreadを使用し、SMPマシンでほぼ線形の高速化を実現するbzip2ブロックソートファイルコンプレッサーの並列実装です。このバージョンの出力は、bzip2 v1.0.2以降と完全に互換性があります(つまり、pbzip2で圧縮されたものはすべてbzip2で解凍できます)。
使用しているプロセッサの数を自動検出し、それに応じてスレッドを作成します。
いくつかのデータ:
Brotli、Deflate、Zopfli、LZMA、LZHAMおよびBzip2圧縮アルゴリズムの比較
CanIUse.com:feature:brotli はMicrosoft Edge、Mozilla Firefox、Google Chrome、Apple Safari、Opera(but Opera MiniまたはMicrosoft Internet Explorer)ではありません。
比較:Brotli vs deflate vs zopfli vs lzma vs lzham vs bzip2
オペレーティングシステムについては触れませんでした。 Windowsの場合、 7-Zip with ZStandard(Releases) は、これらすべてのアルゴリズムの使用をサポートするように変更された7-Zipのバージョンです。
zstd を使用します。 Facebookにとって十分なものであれば、おそらくあなたにとっても十分なものでしょう。
もっと深刻なことに、それは実際にはかなり良いです。私は今それをすべてのために使用します。それが機能するだけであり、大規模な比率と速度のトレードを可能にします(ほとんどの場合、ストレージは安価ですが速度がボトルネックなので、とにかく速度はサイズよりも重要です)。
bzip2と同等の全体的な圧縮を実現する圧縮レベルでは、大幅に高速になり、CPU時間をいくらか増やしたい場合は、ほぼLZMAと同様の結果を実現します(ただし、bzip2よりも遅くなります)。ひどく悪い圧縮率では、bzip2や他の主流の代替よりもはるかに高速です。
これで、SQLダンプを圧縮しています。これは、圧縮するのが非常に簡単で、圧縮するのが非常に簡単です。最悪のコンプレッサーでさえ、その種のデータでは十分に得点します。
したがって、より低い圧縮レベルでzstd
を実行できます。これにより、何十回も実行され、95を達成します。 -99%そのデータに同じ圧縮。
おまけとして、これを頻繁に実行し、追加の時間を費やしたい場合は、事前にzstd
コンプレッサーを「トレーニング」すると、圧縮率と速度の両方が向上します。トレーニングが適切に機能するためには、全体ではなく、個別のレコードをフィードする必要があることに注意してください。このツールの動作方法では、1つの巨大なブロブではなく、トレーニングのために多くの小さくていくぶん似たサンプルが必要です。
ブロックサイズを調整(小さく)すると、圧縮時間に大きな影響を与える可能性があります。
これが私のマシンで行った実験の結果です。 time
コマンドを使用して実行時間を測定しました。 input.txt
は、任意のjsonレコードを含む〜250MBのテキストファイルです。
デフォルトの(最大の)ブロックサイズ(--best
はデフォルトの動作を選択するだけです):
# time cat input.txt | bzip2 --best > input-compressed-best.txt.bz
real 0m48.918s
user 0m48.397s
sys 0m0.767s
最小のブロックサイズ(--fast
引数):
# time cat input.txt | bzip2 --fast > input-compressed-fast.txt.bz
real 0m33.859s
user 0m33.571s
sys 0m0.741s
文書に次のように書かれていることを考えると、これは少し意外な発見でした。
圧縮および解凍の速度は、ブロックサイズの影響をほとんど受けません。