Linux での圧縮・解凍コマンドの速度を検証 [複数 CPU (マルチコア) をフル活用]

Linux で各種圧縮コマンドの性能比較

サーバーの管理をやっていると容量不足等で不要ファイルを圧縮することが多々あります。 また巨大なファイルの圧縮等をすると非常に時間が掛かってサーバーに負荷がかかり運用中の サービス影響することもあります。

またあまりに圧縮・解凍に時間が掛ると何より時間が勿体ないです。 そこで Linux で提供されている様々な圧縮・解凍コマンドを検証してみます。




比較する Linux の圧縮・解凍ソフトウェア

ここでは如何にして早くファイルを圧縮・解凍出来るか様々な Linux コマンドを使って 圧縮・解凍のパフォーマンスを計測してみました。

現在は圧縮・解凍処理を行う際に複数 CPU (マルチコア) をフル活用して圧縮・解凍を行うツールもあります。下記の様々な ツールで検証してみました。
zip
gzip
pigz
pigz -11
bzip2
lbzip2
pbzip2
xz
pxz
pixz


検証環境

検証に利用したマシンのスペックは次の通りです。Ubuntu 17.04 と 4CPU、搭載メモリーは 8GB です。
$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 17.04
Release:        17.04
Codename:       zesty
$ cat /proc/cpuinfo
processor       : 0
vendor_id       : GenuineIntel
model name      : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
physical id     : 0
siblings        : 4
core id         : 0
cpu cores       : 4

processor       : 1
vendor_id       : GenuineIntel
model name      : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
physical id     : 0
siblings        : 4
core id         : 1
cpu cores       : 4

processor       : 2
vendor_id       : GenuineIntel
model name      : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
physical id     : 0
siblings        : 4
core id         : 2
cpu cores       : 4

processor       : 3
vendor_id       : GenuineIntel
model name      : Intel(R) Core(TM) i5-3470 CPU @ 3.20GHz
physical id     : 0
siblings        : 4
core id         : 3
cpu cores       : 4
$ cat /proc/meminfo
MemTotal:        8044660 kB


各 Linux 圧縮・解凍コマンドの検証

それでは早速検証を開始しますが、まず圧縮対象となるファイルを作成します。 作成するファイルサイズは 10MB としますので、以下のように dd コマンドを使ってゼロ埋めされた ファイルを作成します。
$ LANG=C dd if=/dev/zero of=tmp.txt bs=1M count=10
10+0 records in
10+0 records out
10485760 bytes (10 MB, 10 MiB) copied, 0.0119667 s, 876 MB/s

$ ll -h tmp.txt
-rw-rw-r-- 1 foobar foobar 10M 2017-09-14 10:43:23 tmp.txt

tmp.txt という 10MB のファイルを作成したら、以下のコマンドを実行して 何度か検証してみます。以下は同じコマンドの圧縮コマンドと解凍コマンドを 使用して圧縮後に解凍を各ツールで連続して実行します。
time zip -q tmp.zip tmp.txt && time unzip -qu tmp.zip && rm tmp.zip
time gzip           tmp.txt && time gunzip tmp.txt.gz
time pigz           tmp.txt && time unpigz tmp.txt.gz
time pigz -11       tmp.txt && time unpigz tmp.txt.gz
time bzip2          tmp.txt && time bunzip2 tmp.txt.bz2
time lbzip2         tmp.txt && time lbunzip2 tmp.txt.bz2
time pbzip2         tmp.txt && time pbzip2 -d tmp.txt.bz2
time xz             tmp.txt && time unxz tmp.txt.xz
time pxz            tmp.txt && time unxz tmp.txt.xz
time pixz           tmp.txt && time pixz -d tmp.txt.xz

上記コマンド群を5回実行してその平均値を取ってみました。その結果が次の通りとなっています。


検証結果 [ lbzip2 が最速 ]

この結果から、総合的に見て圧縮・解凍共に lbzip2 コマンド(圧縮)とその解凍コマンドである lbunzip2 が圧縮・解凍性能共に非常に優秀です。

10MB のファイルを圧縮するために lbzip2 は 0.021 秒を要しており、それを解凍するために lbunzip2 コマンドが 0.015 秒を要したということで、その他のコマンドに比して最速です。

次点としては pigz コマンドもかなり優秀ですね。なお CPU の利用率が 100% を 超えているものはちゃんと複数 CPU が使われていることを示しています。

逆に 100% 以下のコマンドは複数 CPU を使い切れていない ということになります。
-----------------------+----------+-------------
圧縮/解凍コマンド        | CPU利用率 | 合計所要時間(秒)
-----------------------+----------|-------------
zip -q tmp.zip tmp.txt |  99% cpu | 0.109 total
unzip -qu tmp.zip      |   0% cpu | 0.003 total
-----------------------+----------|-------------
gzip      tmp.txt      |  97% cpu | 0.103 total
gunzip    tmp.txt.gz   |  96% cpu | 0.083 total
-----------------------+----------|-------------
pigz      tmp.txt      | 272% cpu | 0.037 total
unpigz    tmp.txt.gz   | 163% cpu | 0.024 total
-----------------------+----------|-------------
pigz -11  tmp.txt      | 394% cpu | 1.962 total
unpigz    tmp.txt.gz   | 117% cpu | 0.027 total
-----------------------+----------|-------------
bzip2     tmp.txt      |  97% cpu | 0.095 total
bunzip2   tmp.txt.bz2  |  94% cpu | 0.059 total
-----------------------+----------|-------------
lbzip2    tmp.txt      | 243% cpu | 0.021 total
lbunzip2  tmp.txt.bz2  | 293% cpu | 0.015 total
-----------------------+----------|-------------
pbzip2    tmp.txt      | 257% cpu | 0.045 total
pbzip2 -d tmp.txt.bz2  |  89% cpu | 0.036 total
-----------------------+----------|-------------
xz        tmp.txt      |  99% cpu | 0.289 total
unxz      tmp.txt.xz   |  94% cpu | 0.059 total
-----------------------+----------|-------------
pxz       tmp.txt      | 101% cpu | 0.286 total
unxz      tmp.txt.xz   |  93% cpu | 0.030 total
-----------------------+----------|-------------
pixz      tmp.txt      |  97% cpu | 0.290 total
pixz -d   tmp.txt.xz   |  91% cpu | 0.044 total
-----------------------+----------|-------------