大量の大容量ファイルをすばやく圧縮

大量の大容量ファイルをすばやく圧縮

私は毎日約200 GBのログデータを生成し、約150のさまざまなログファイルに分散しています。

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

200GBのログを12~15GB程度に圧縮すると良い結果が得られました。

問題は、ファイルを圧縮するのに時間がかかることです。これ予約されたことジョブは毎日午前2時30分に実行され、午後5時から6時まで続きます。

圧縮をスピードアップし、より早く作業を完了する方法はありますか?どんなアイデアがありますか?

他のプロセスについては心配しないでください。圧縮は次の場所で行われます。那須、専用セッションでこれを行うことができます。仮想デバイスそこから圧縮スクリプトを実行します。

これが出力ですトップ参考までに:

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

答え1

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

ボトルネックがディスクI / Oの場合、できることはあまりありません。ディスクが多数の並列要求を処理していないことを確認してください。これはパフォーマンスを低下させるだけです。

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

ボトルネックがCPUの場合、最初に考慮する必要があるのは、より高速な圧縮アルゴリズムを使用することです。 Bzip2は必ずしも悪い選択ではありません。主な弱点は解凍速度です。しかし、gzipを使用して圧縮速度のためにサイズを犠牲にしたり、lzopやlzmaなどの他の形式を試してみることもできます。圧縮レベルを調整することもできます。 bzip2 のデフォルト値は-9(最大ブロックサイズ、つまり最大圧縮時間と最大圧縮時間) です。環境変数を圧縮レベル3BZIP2に設定します。-3このスレッドそしてこのスレッド特に一般的な圧縮アルゴリズムについて説明する。このブログ投稿derobertが引用したいくつかのベンチマークではgzip -9bzip2bzip2 -9これは別のベンチマークですまた、bzip2圧縮率が低レベルでより速く達成できることを示すlzma(7zipのアルゴリズムなので、7z代わりに使用可能)も含まれています。 bzip2以外の選択をすると、解凍時間が短縮されます。圧縮率はデータによって異なり、圧縮速度はコンプレッサーのバージョン、コンパイル方法、およびそれを実行しているCPUによって異なります。tar --lzmalzma

ボトルネックがCPUでコアが複数ある場合、別のオプションは並列圧縮です。これを行う方法は2つあります。すべての圧縮アルゴリズムに適用される1つのアプローチは、ファイルを個別に(個別にまたはグループごとに)圧縮し、次を使用することです。parallelアーカイブ/圧縮コマンドを並列に実行します。これにより圧縮を減らすことができますが、個々のファイル検索が高速化され、すべてのツールで使用できます。別のアプローチは、圧縮ツールの並列実装を使用することである。このスレッドいくつかリストしてみてください。

答え2

並列gzipをインストールpigzし、マルチスレッド圧縮でtarを使用できます。良い:

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

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

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

もちろん、NASにマルチコア/強力なCPUがない場合は、とにかくCPUのパフォーマンスによって制限されます。

仮想マシンと圧縮ハードドライブ/アレイの実行速度もボトルネックを引き起こす可能性があります。

答え3

データを圧縮する最も高速で効率的な方法は、より少ない量のデータを生成することです。

どのタイプのログを生成しますか? 1MBのテキストが約500ページに相当するので、1日に1億ページに相当するテキストを生成することを考慮すると、1日200GBはかなり多いようです(Googleや一部ISPではない以上...)。 d 週刊図書館で議会を記入します。

ログデータを確認して、何らかの方法でデータを減らし、ログから必要な情報を取得できることを確認してください。たとえば、ログレベルを下げるか、より簡潔なログ形式を使用します。または、統計にログを使用する場合は、ただちに統計を処理し、要約を含むファイルをダンプし、保存用に圧縮する前にログをフィルタリングします。

答え4

圧縮量を減らして(節約スペースの面で)スピードを上げることができます。まず、bzip2は圧縮率が低いにもかかわらずgzipよりはるかに遅いです。速度のためにサイズを交換するために、bzip2、gzip、またはほとんどのコンプレッサーの圧縮レベルを変更することもできます。

速度をサイズに変更したくない場合は、LZMA(xzなど)を使用してコンプレッサーを使用して速度を上げながら同じサイズまたは小さいサイズを取得できます。

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

関連情報