gzip の限界 = CPU 1コア
マルチコア・マルチスレッドのCPUがあるのに、gzip や lzma(xz)や bzipといったメジャーな圧縮は、CPUを1コアで処理するんですね。
CPU使用率を見てみたら、CPU利用率は100%を超えないんですね。
HDD・SSDの書き込み速度に限界があるからそれでも良かったんだろうが。いまはメモリが一般的に64GBもある時代です。うちのマシンでもメモリが12GBもあるのに3GB程度の圧縮に、5分とか耐えられません。もうちょっと速くしたい。
cpu利用率が100%で頭打ちになる。gzip
gzipを使ってると、CPU利用率が100%で止まるんですよね。lzma などの他の圧縮でも同じ。
gzip/ gunzip をマルチで処理する pigz / unpigz
Pigz のマニュアルには次のように書いてある。スレッドを使って並列処理をするっぽい。
Pigz compresses using threads to make use of multiple processors and cores. The in‐ put is broken up into 128 KB chunks with each compressed in parallel. The individual check value for each chunk is also calculated in parallel. The compressed data is written in order to the output, and a combined check value is calculated from the in‐ dividual check values.
実際にやってみると
cpu の利用率が、グンと上がる。CPUが余ってるなら、圧縮でもCPUをフルに使ったほうが良さそう。
インストール
gzip の場合
sudo apt install pigz
bzip の場合
sudo apt install pbzip2
xzの場合
sudo apt install pixz
まとめてインストールできない感じなのが辛い。piXXだとか pbzip2 とか表記が揺れているのも辛い。
詳しくは、参考資料に上げたURLに記載されているコマンドを必要に応じてインストールする必要がある。
7z でも マルチスレッド対応らしいが、time 7z a -mmt=on sample.gz ./sample
を見た感じだと、gzipなどはマルチコア・マルチスレッドを使わないようだ。
実行速度比較
使用したCPU
takuya@livaz:~$ 7z 7-Zip [64] 16.02 : Copyright (c) 1999-2016 Igor Pavlov : 2016-05-21 p7zip Version 16.02 (locale=en_US.UTF-8,Utf16=on,HugeFiles=on, 64 bits,4 CPUs Intel(R) Pentium(R) CPU N4200 @ 1.10GHz (506C9),ASM,AES-NI)
使用したファイル
takuya@livaz:/var/lib/libvirt/images$ ll -h sample -rw-r--r-- 1 takuya takuya 3.6G Apr 13 02:04 sample
gzip での速度
takuya@livaz:/var/lib/libvirt/images$ time gzip sample real 4m10.198s user 3m58.115s sys 0m5.359s
pigz での速度
takuya@livaz:/var/lib/libvirt/images$ time pigz sample real 1m38.232s user 4m56.837s sys 0m9.070s
比較
real で比較
コマンド | real | user |
---|---|---|
gzip | 4m10.198s | 3m58.115s |
pigz | 1m38.232s | 4m56.837s |
CPUを4スレッド使うことで、ちゃんと約4倍の時間を稼げていることがわかる。もちろん分散のオーバーヘッドが入るので、完璧に1/4にはならないのですが。
まとめ
CPUが余ってるなら マルチスレッドをCPUで使い切ったほうが絶対早い。