mgzip でマルチコア CPU を使ったファイル圧縮

LVM で snapshot をとって、そのパーティションを dd で吸い出して gzip 圧縮してファイル保存、ということをしてたんですが。
どうも gzipボトルネックになって、dd での読み出し速度が出ない。せっかく CPU がマルチコアなのに gzip は 1 CPU しか使っていないようなので、mgzip を使ってみた。

参照元マルチコアCPUを活用したファイル圧縮 | SourceForge.JP Magazine です。今回は dd からの出力を圧縮する都合で、標準入出力を扱えない pbzip2 はパス。

まずインストール。
普通に make するとコンパイルが通らないので、参照元の記事のとおり、mgzip.c 内の gz_header をすべて mgz_header に置換する。

$ tar zxvf smp_mgzip_1.2c.tar.gz
$ cd smp_mgzip_1.2c/
$ ./configure
$ perl -pi -e 's/gz_header/mgz_header/g' mgzip.c
$ make
$ make test
$ sudo cp mgzip /usr/local/bin

make install はできないので cp した。

速度とファイルサイズの比較。 -t オプションは使用するスレッド数。

コマンド        圧縮に掛かる時間(秒)     ファイルサイズ(MB)
---------------------------------------------------------
gzip               15.14                   64.3
mgzip               5.72                   77.8
mgzip -t 3          4.78                    ↑
mgzip -t 4          3.90                    ↑

gzip  -5           12.37                   65.4
mgzip -5            7.51                   67.6
mgzip -5 -t 3       7.53                    ↑
mgzip -5 -t 4       7.53                    ↑

gzip -9            31.92                   63.7
mgzip -9           18.04                   66.0
mgzip -9 -t 3      17.68                    ↑
mgzip -9 -t 4      18.36                    ↑

デフォルトだとファイルサイズは 20% ほど大きくなるが、速度は 3〜4 倍! 圧縮率を上げようと -9 を付けると、サイズは普通の gzip より大きく、速度は遅く、という多少微妙な結果に。-5 ぐらいがバランスがいいのかな。