多数の大きなファイルを高速で圧縮する


16

毎日約200 GBのログデータが生成され、約150の異なるログファイルに分散されています。

ファイルを一時的な場所に移動し、一時ディレクトリでtar-bz2を実行するスクリプトがあります。

200 GBのログは約12〜15 GBに圧縮されているため、良い結果が得られます。

問題は、ファイルの圧縮に永遠に時間がかかることです。cronジョブは、毎日午前2時30分AMに実行され、5まで実行し続けます:00-6:00 PMを。

圧縮の速度を改善し、ジョブをより速く完了する方法はありますか?何か案は?

他のプロセスとすべての心配しないで、圧縮が起こる場所は、上にあるNAS、そして私は、専用のNASマウント実行することができVMをし、そこから圧縮スクリプトを実行します。

参照用のtopの出力は次のとおりです。

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

2
複数のCPUがあり、複数のtarファイルがある場合、または複数のtarファイルに分割できる場合、複数の圧縮を実行できます。
ジェフシャラー

@JeffSchallerは、複数のbzip2プロセスが異なるファイルを圧縮し、同じtar.bz2ファイルに書き込むことを可能にするでしょうか?
アヌ

2
NASに移動する前に、ログファイルはローカルディスクに生成されていますか?圧縮したら移動します。この方法では、圧縮時に100(移動)、115(100read + 15write)ではなく、ネットワーク経由で15Gbのデータのみを送信します。あるいは、その1つのbzip2プロセスでCPUにバインドされているように見えるため、複数(CPUごとに1つ)を並列に実行すると役立つ場合があります(I / O制限に達するまで)。または、より単純な圧縮(「gzip -1」など)を使用します。ディスク容量を節約することはできませんが、実行速度は速くなります。
スティーブンハリス

@Sukminder間違いなくこれを試して、サイズの違いを確認します。ありがとう。
アヌ

あなたのtopあなたのシングルスレッド化という出力が示すbzip2プロセスが一つのコアを限界いっぱいまでされていますが、クアッドコアシステム( - > 100%のCPUを使用して一つのプロセスでそれを実行していることを25.1%ユーザースペースCPU時間、74%のアイドル)。したがって、小さな変更を加えると、他の何かがボトルネックにならない限り、4倍の速度で処理できます。Gillesの回答を注意深く読んでください。データを保持するディスクと同じボックスでCPUを使用して圧縮を行うことを検討してください。(ファイルの一部を1つのボックスで圧縮し、他のファイルを他のボックスで圧縮し、その後アーカイブすることもあります。そのため、両方のCPUが使用されます。)
Peter Cordes

回答:


25

最初のステップは、ボトルネックが何であるかを把握することです。ディスクI / O、ネットワークI / O、またはCPUですか?

ボトルネックがディスクI / Oである場合、できることはあまりありません。パフォーマンスを低下させる可能性があるため、ディスクが多くの並列リクエストを処理しないようにしてください。

ボトルネックがネットワークI / Oである場合、ファイルが保存されているマシンで圧縮プロセスを実行します。CPUがより強力なマシンで実行するのは、CPUがボトルネックである場合にのみ役立ちます。

ボトルネックがCPUである場合、最初に考慮すべきことは、より高速な圧縮アルゴリズムの使用です。Bzip2は必ずしも悪い選択ではありません-その主な弱点は解凍速度です-しかし、gzipを使用して圧縮速度のためにサイズを犠牲にするか、lzopやlzmaなどの他の形式を試してみることができます。圧縮レベルを調整することもできます。bzip2のデフォルトは-9(最大ブロックサイズなので、最大圧縮ですが、最長の圧縮時間)。環境変数BZIP2を、-3圧縮レベル3を試すような値に設定します。このスレッドこのスレッドは、一般的な圧縮アルゴリズムについて説明しています。具体的には、このブログの記事 derobertによって引用はお勧めいくつかのベンチマークを提供していますgzip -9か、bzip2低レベルではに比べて良い妥協かもしれませんbzip2 -9。lzma(7zipのアルゴリズムなので、代わりに使用することもできます)を含むこの他のベンチマークは、低レベルでbzip2圧縮率に速く到達できることを示唆しています。bzip2以外の選択肢を選択すると、解凍時間が改善されます。圧縮率はデータに依存し、圧縮速度は圧縮プログラムのバージョン、コンパイル方法、および実行されるCPUに依存することに注意してください。7ztar --lzmalzma

ボトルネックがCPUであり、複数のコアがある場合の別のオプションは、圧縮を並列化することです。それを行うには2つの方法があります。任意の圧縮アルゴリズムで機能する方法の1つは、ファイルを個別に(個別に、またはいくつかのグループで)parallel圧縮し、アーカイブ/圧縮コマンドを並行して実行することです。これにより、圧縮率は低下しますが、個々のファイルの取得速度が向上し、任意のツールで動作します。もう1つのアプローチは、圧縮ツールの並列実装を使用することです。このスレッドにはいくつかのリストがあります。


4
「ボトルネックがディスクI / Oである場合、できることはあまりありません。」おそらく圧縮率はすでに良好であるため、これはおそらく真実ですが、一般にI / Oがボトルネックである場合は、より多くのCPUを使用してより良い圧縮率を取得することを検討する価値があります(異なる圧縮設定または異なるアルゴリズムを使用)。 ..「I」を実際に減らすことはできません(すべてのデータを読み込む必要があるため)。ただし、「O」を大幅に減らすことができる場合があります:-)
psmears

1
7z「ソリッド」アーカイブを作成しない、または「ソリッド」ブロックのサイズを制限しないように指示すると、複数のLZMAスレッドが並行して実行されます(IIRC)。ログファイルデータは、非常に冗長になる傾向があるため(ライン間の類似性のロット)、圧縮の特殊なケースです。それは間違いなく価値がテストだgzipbzip2と、xzただのオプションを除外するために、一般的な圧縮ベンチマークを見ているのではなく、OPの特定のログファイルに。でも速いコンプレッサーは検討する価値があります(lzoplz4snappy)。
ピーター

最近の推奨LZMAコンプレッサーはxzです。使用tar -J--xz、ではない--lzma。 .lzma「レガシー」ファイル形式と見なされます。LZMA圧縮のためのファイル形式の複数の反復は、ちょっと恥ずかしいことであり、最初から正しく行われているはずです。しかし、今のところ基本的には問題なく、.xzは同じ圧縮ストリーム用の別のファイル形式に置き換えられることはありません。
ピーターコーデス

7zには優れた圧縮とマルチスレッドがありますが、アーカイブ形式のために(インデックスが必要ですか、それともバグですか?)パイプラインの途中で使用できるとは思わない-stdin stdoutを使用しません同時に
-Xen2050

これは本当に役に立ち、洞察力がありました。私のチームは、NFSを介した操作が大きなボトルネックであると考えました。
アヌ

16

pigzマルチスレッド圧縮でtarをインストールし、パラレルgzipを使用してtarを使用できます。お気に入り:

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

どこ-Iのオプションは次のとおりです。

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

もちろん、NASに複数のコア/強力なCPUが搭載されていない場合は、CPUパワーの制限があります。

VMと圧縮が実行されているハードディスク/アレイの速度もボトルネックになる可能性があります。


1
また、bzip2を使用する場合は、pbzip2またはを使用できますlbzip2
ラドバンガラビク16

2
これが最良の答えです。ただし、最初に、最初の移動が元のファイルと同じファイルシステム上にあることを確認してください。それ以外の場合、「移動」は実際にはバイトコピーしてから削除です。同じファイルシステム上での移動とは、ファイルシステムリンクの再配置です。それは桁違いに高速です。数百ギガバイトのサイズのログファイルでは、pizzがすべての違いをもたらしました。実行する並列スレッドの数を伝えることができます。CPUに複数のコアがある限り、調査に多くの時間を費やすことはありません。どんなイベントでもpigzが必要になるでしょう。すぐにスピードアップできます。
マイクS

システムをさらに調査したい場合は、ピッツピングしたら、htopおよびiostatの出力を見て、システムのパフォーマンスを観察します。しかし、再び、pigsなしで大きなファイルを圧縮しようとすることはもうありません。最新のマルチコアシステムでは、使用しないのはばかげています。それはそのような即時の勝利です-あなたが見るでしょう。
マイクS

7

データを圧縮する最も速く最も効果的な方法は、生成するデータの量を減らすことです。

どのようなログを生成していますか?1日200GBは非常に多く聞こえます(GoogleまたはISP以外...)、1MBのテキストは約500ページであると考えてください。したがって、1日あたり1億ページのテキストに相当するものを生成します。 1週間で議会図書館を埋めます。

ログデータを何らかの方法で削減し、必要なものをログから取得できる場合は、ログデータを確認します。たとえば、ログレベルを下げるか、terserログ形式を使用します。または、統計にログを使用している場合は、その場で統計を処理し、ファイルを要約とともにダンプしてから、ストレージの圧縮前にログをフィルタリングします。


1
これは興味深い哲学的解決策です。人生の問題のほとんどの解決策は、問題がまったくないということを避けることです。それが提案を綿密に検討し、これを達成するために通過しなければならない数百人の人々と数千人の承認があることに気付くまでです。
アヌ

1
@anu質問の文脈が与えられていないので、私は何も仮定していません。そして、何千人もの承認を得た場所を教えてください。私にはあなたがそれを作り上げたように思えます。
エミリーL.

これに賛成します。これはしばしば見落とされがちですが、一度気がつくと、人生の多くの問題に対する顕著な解決策です。
jrw32982は、Monica

1
まあ..私はそこで働いていないので、これがAppleの問題であったことを少なくとも明らかにすることができます。より具体的には、オンラインアプリストアにサービスを提供するサービススタックで...数千のマイクロサービスがあり、それぞれが圧縮する必要のあるログを生成し、それらの変更時にサインオフする必要があるため、ええ、数千の承認はほとんど現実ですロギングレベルなど...とにかく...この社内のソリューションを見つけました。これは、別のマイクロサービスにオフロードされる並列gzipとほぼ同等です。
アヌ

3

圧縮量を(節約されたスペースの観点から)削減して、高速化することができます。そもそも、bzip2はgzipよりもかなり遅いですが、圧縮率は小さくなります。bzip2、gzip、またはほとんどの圧縮プログラムの圧縮レベルを変更して、サイズと速度を交換することもできます。

速度のサイズを交換したくない場合は、LZMA(xzなど)を使用するコンプレッサーを使用して速度を改善しながら、おそらく同じサイズ以下にすることができます。

検索するとベンチマークを見つけることができますが、最善の策は、ターゲットハードウェア上の独自のファイルでいくつかのテストを行うことです。


3

圧縮が高速であることだけが必要な場合は、lz4をお勧めします非常に強くます。

圧縮率よりも圧縮の速度が重要な多くの場所で使用されています(例:ZFSのような透過的な圧縮を備えたファイルシステム)


これまで聞いたことがない、xzのように、それを使用するほぼすべての場所にすでにインストールされている可能性が高いプログラムはありますか?
Xen2050
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.