AMIのリージョン間移行などで、サイズの大きなファイル圧縮をするときに、圧縮時間を短縮するためにc1.xlargeなどのCPUパワーが大きなインスタンスを利用することがあると思います。

ただし、c1.xlargeは仮想コア数が8なので、圧縮を並列処理で行ってない場合は、1つの仮想コアしか利用せず、せっかくのc1.xlargeを有効に利用することができません。

残念ながら、gzipやbzip2は並列処理には対応しておらず、並列処理で圧縮するには、pbzip2を利用する必要があります。

pbzip2は、下記のようにepelリポジトリからインストールすることができます。

# yum install -y pbzip2

実験の前に、圧縮対象のファイル(10GB)を用意しておきます。

# dd if=/dev/zero of=test.img bs=1M count=10240
# ls -lh
total 11G
drwx------ 2 root root 16K Aug  3 06:32 lost+found
-rw-r--r-- 1 root root 10G Aug  3 06:40 test.img

まずは、bzip2で圧縮してみました。

# time bzip2 test.img
real 4m34.865s
user 3m50.789s
sys 0m12.283s

topコマンドの結果より、仮想コアを1つしか利用していないことがわかります。

Cpu0  : 87.9%us,  3.5%sy,  0.0%ni,  4.1%id,  4.5%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.3%sy,  0.0%ni, 99.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

また、解凍も同様です。

# time bzip2 -d test.img.bz2
real 2m57.142s
user 0m56.602s
sys 0m21.794s
Cpu0  :  0.0%us,  3.9%sy,  0.0%ni, 10.4%id, 85.7%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  6.5%sy,  0.0%ni, 61.5%id, 32.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  : 29.9%us, 11.5%sy,  0.0%ni,  0.0%id, 58.6%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

次に、pbzip2です。bzip2より圧縮時間が短縮されていることがわかります。

# time pbzip2 test.img
real 2m12.309s
user 3m52.277s
sys 0m14.952s

topコマンドの結果より、すべての仮想コア(8)を利用していることがわかります。

Cpu0  : 17.9%us,  5.5%sy,  0.0%ni,  4.8%id, 71.6%wa,  0.0%hi,  0.0%si,  0.2%st
Cpu1  : 15.3%us,  0.4%sy,  0.0%ni, 84.3%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  : 15.5%us,  0.6%sy,  0.0%ni, 83.7%id,  0.0%wa,  0.0%hi,  0.0%si,  0.2%st
Cpu3  : 15.6%us,  0.4%sy,  0.0%ni, 84.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  : 15.4%us,  0.6%sy,  0.0%ni, 80.1%id,  3.9%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  : 15.6%us,  0.4%sy,  0.0%ni, 84.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  : 15.3%us,  1.0%sy,  0.0%ni, 83.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  : 15.2%us,  0.6%sy,  0.0%ni, 84.2%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

しかし、解凍にかかった時間は、あまり変わりませんでした。

# time pbzip2 -d test.img.bz2
real 2m33.437s
user 0m56.642s
sys 0m21.098s

topコマンドの結果を確認すると、解凍は1つしか仮想コアを利用していないことがわかります。

Cpu0  : 35.0%us, 37.9%sy,  0.0%ni,  0.9%id, 26.3%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu1  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu2  :  0.0%us,  0.2%sy,  0.0%ni, 99.8%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu3  :  0.0%us,  0.5%sy,  0.0%ni, 99.5%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu4  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu5  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu6  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
Cpu7  :  0.0%us,  0.0%sy,  0.0%ni,100.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st

上記より、スナップショットを別リージョンに移行する場合は、c1.xlarge上で作業して、圧縮はpbzip2で行うと圧縮時間を短縮することができます。

こちらの記事はなかの人(suz-lab)監修のもと掲載しています。
元記事は、こちら