pigzという並列でgzip圧縮を行うプログラムがあったので試してみた.

インストール

1
2
3
4
$ wget http://zlib.net/pigz/pigz-2.2.4.tar.gz
$ tar zxvf pigz-2.2.4.tar.gz
$ cd pigz-2.2.4
$ make

公式サイトからソースを落としてきてコンパイルする.これでpigzとunpigzが生成される.

使い方

圧縮する対象が単一ファイルかディレクトリかで使い方を分ける必要がある.今回の例ではスレッド数を4とし,圧縮するファイル/ディレクトリをFILE/DIRという名前にしている.

単一ファイルの場合

1
$ pigz -p 4  FILE

とするとpigzで圧縮することができる.この場合にはFILEがそのままFILE.gzとなる.圧縮するファイル自体を残しておきたい場合には,-kのオプションを付けることで別途圧縮ファイルを作成することができる.

ディレクトリの場合

1
$ tar c DIR | pigz -p 4 > DIR.tar.gz

ディレクトリをそのまま圧縮する場合は,tarで一度ディレクトリを固めてからpigzに渡して圧縮する.なお,tarで固めずにpigz -r DIRなどとしてしまうと,ディレクトリ内の全部のファイルがそれぞれ個別に圧縮されるので注意が必要.

動いている様子

スレッド数を16にしてpigzを動かしているところをhtopで見ている.

ここでは,上で紹介した基本機能以外に圧縮時のブロックサイズを-bで指定している.圧縮効率/速度に影響してくるパラメータに関しては色々と試してみたのだが,あまりハッキリとした結果が得られなかったので調整を諦めた部分がある.実際に圧縮しているところを監視していると,全コア使って圧縮処理をしている場合や,待機(S)が長く続く場合など,一概にスレッド数を重ねるほど圧縮効率が良くなるわけでもなさそうな印象を受ける.この辺りに関しては,HDDのI/Oや圧縮するファイルのサイズに大きく依存するところなので,あまり厳密に調べたりしても意味がないとは思うが….まあ,gzipよりかは確実に早くなるとは思うので,圧縮の際にはデフォルトでpigzを使うというくらいの感じで良いと思う.

Muninを使ったCPU使用率の可視化

Muninを使って300GBくらいのディレクトリを圧縮している様子.スレッド数を6程度で様子見していたのだが,なかなか終わらない….

参考資料