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で行うと圧縮時間を短縮することができます。