はじめに
最近のCPUやストレージは高速なので、zipコマンドで大きなファイルを圧縮するのにそれほどストレスを感じません。
ですが、大きなファイルが幾つもある時は、zipコマンドでアーカイブ&圧縮するのにそれなりに時間がかかると思います。
これは、zipコマンドではCPUのコア数やスレッド数に関わらず、「処理に使っているのは常に1コア」ということが原因だと思われます。
そこで、マルチスレッドを使って圧縮できる"pigz"を使うと、どの程度処理が高速化するのかを試してみました。
使用した環境
- OS:CentOS 6.10
- CPU:Core-i3 6100T(2コア4スレッド)
- メモリ:DDR4-8GB(4GB×2枚)
- SSD:NVMe 128GB
下準備
- 以下のスクリプトを実行して、100MBのファイルを10個作成します。
- 10ファイル程度なら、ddコマンドを10回実行するのもありかもしれません...
mkfile.sh
# !/bin/sh
for i in {1..10}; do
dd if=/dev/zero of=100M_$i.txt bs=1M count=100
done
テスト方法
- 上記のコマンドで作成した10ファイルを、1つのファイルにまとめて圧縮する際の処理時間を計測しました。
- なお、zipコマンドは「アーカイブ」と「圧縮」の2つの機能を持っていますが、gzipコマンドとpigzコマンドは圧縮機能しか持っていないため、tarコマンドと併用しました。
zipを使った圧縮
[root@akagi zip_test2]# time zip 1G.zip *.txt
gzipを使った圧縮
[root@akagi zip_test2]# time tar c ./*.txt | gzip > 1G.tar.gz
pigzを使った圧縮
[root@akagi zip_test2]# time tar c ./*.txt | pigz > 1G.tar.gz
テスト結果
- zipコマンドおよびgzipコマンドと比べて、pigzコマンドでは処理時間が約半分ほどになりました。
- コア数の少ないCore-i3でこれだけの差が出るので、コア数の多いサーバー用CPUではさらに大きな差が付くと思われます。
zipコマンド | gzipコマンド | pigzコマンド |
---|---|---|
0m5.903s | 0m6.080s | 0m3.239s |
補足
- 「-p」オプションを指定すると、pigzコマンドの実行時に使われるスレッド数を指定できます。
- 高速化したいけれども、CPUの全リソースを使われると困る...という時に便利だと思います。
4スレッドで圧縮する
[root@akagi zip_test2]# time tar c ./*.txt | pigz -p 4 > 1G.tar.gz