2013年10月11日金曜日

ログファイルの圧縮方法

このエントリーをはてなブックマークに追加
以前紹介したのですが、ftp.jaist.ac.jpのアクセスログの圧縮にはpbzip2を使っています。最初はgzipを使っていましたが、アクセス数の増加とともにログが大きくなって、ディスク容量を圧迫するようになってきたのでbzip2に切り替えました。

gzipとbzip2の圧縮率はアクセスログでは約2倍違います。たとえば、2013年10月8日のhttpdのログファイルは1.67GBあります。これをデフォルトの圧縮レベルでgzipで圧縮すると195MBに、bzip2では104MBになります。その代りに所要時間はずっと長くなります。Xeon X5660 (2.8GHz)のサーバーで測ると、gzipが36.5秒なのに対してbzip2は7分46秒と12.8倍掛かります。

Xeon X5660なのでbzip2でも7分46秒で済んでいますが、ftp.jaist.ac.jpのUltraSPARC T1ですと2時間18分掛かります。深夜の空いている時間に実行した結果がこれです。UltraSPARC T1のシングルスレッド性能は恐ろしく低いのです。

Firefoxのダウンロードを引き受けていてアクセスの多かったころのログファイルは、今の10倍近い15GB前後ありました。これをbzip2で圧縮すると、圧縮時間が忙しい日中にまたがることもあって、24時間以上掛かっていました。そこでUltraSPARC T1の8コア32スレッドを生かせるpbzip2を導入して今に至ります。

xzについては一度検討しましたが、あまりにも遅かったので採用しませんでした。ただしxzが遅いのは、bzip2よりずっと高い圧縮率を得ようとした場合です。xzは圧縮レベルによって、所要時間と圧縮率のバランスが劇的に変わります。bzip2と比べて一概に遅いわけではありません。

以下に、先のアクセスログを圧縮レベルを変えてxzで圧縮したときの圧縮率と所要時間を示します。所要時間は先のXeon X5660のサーバーで測ったものです。
レベル サイズ(MB) 圧縮率 bzip2比 所要時間 bzip2比
0 142.8 8.52% 138% 03分07秒 40%
1 111.4 6.65% 107% 03分34秒 46%
2 100.7 6.01% 97% 04分42秒 60%
3 94.5 5.64% 91% 06分21秒 82%
4 104.4 6.23% 101% 11分24秒 147%
5 93.0 5.55% 90% 19分48秒 255%
6 84.3 5.03% 81% 38分46秒 499%
7 81.9 4.89% 79% 39分56秒 514%
8 79.7 4.76% 77% 41分16秒 531%
9 77.8 4.65% 75% 42分22秒 545%
圧縮レベル2と3では、bzip2よりずっと短い所要時間で高い圧縮率が得られています。興味深いのはレベル4で、所要時間が大きく増えたのに圧縮率が下がっています。xzはレベル4からLZ法の一致文字列を探すアルゴリズムが変わるので、これが裏目に出ているようです。

bzip2より2割以上高い圧縮率が得られるレベル7以上では、所要時間は5倍以上になります。ログファイルの圧縮方式が混ざるのは何かと面倒なので、5倍の所要時間でこの程度の圧縮率の差ではxzに変更する気にはなれないです。

圧縮率はそうでもないですが、xzの伸張速度の速さはとても魅力的です。デフォルトの圧縮率のファイルを伸張するのに、bzip2が1分22秒かかるのに対してxzは25秒しか掛かりません。ログを集計するときに伸張速度が3倍近く速いのはとても有利です。

もし圧縮方法を決め直せるならxzにするかもしれません。適宜レベルを調節してbzip2の置き換えを狙ってもいいですし、5倍の所要時間を許容すれば高い圧縮率も狙えます。pxzpxizといった並列版もあるので複数スレッドを使った高速化も可能ですしね。

0 件のコメント:

コメントを投稿