distccを使ってEC2で分散ビルドを試す。
EC2は並列ビルドと相性がよさそうだ思ったので試してみた。
- 環境
- c1.medium Amazon Linux 32bit x最大8台まで
- ターゲット
- php5.4
distccをすべてのホストにインストールする必要がある。
しかしAWSなら簡単にスナップショットを取って複製マシンが作れるので凄くお手軽です。
distccのインストール
残念なことにAmazon Linuxのyumではdistccが見つからなかったので、ソースからビルドすることに。
wget http://distcc.googlecode.com/files/distcc-3.1.tar.bz2 tar xvjf distcc-3.1.tar.bz2 sudo yum install -y python-devel cd distcc-3.1 ./autogen.sh ./configure make sudo make install
distccdの起動
/etc/init.dに/usr/local/share/doc/distcc/example/initをコピーして起動時に有効になるようにする。
sudo cp /usr/local/share/doc/distcc/example/init /etc/init.d/distcc sudo chmod 755 /etc/init.d/distcc
/usr/local/etc/distcc/clients.allow 等がインストールされるのだが、
exampleのinitファイルではそれらを読むようになっていないので意味が無かった。
しかたなく、/etc/init.d/distccの中身を変更
start() { echo -n $"Starting $SERVICE: " daemon /usr/local/bin/$SERVICE --daemon RETVAL=$? echo [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE return $RETVAL }
の --daemonの後ろに "--allow=10.0.0.0/8 --allow=127.0.0.1"を追加
sudo chkconfig --add distcc sudo /etc/init.d/distcc start
psで起動していることを確認する。
distccについてはいったんこれで終わり
実際にphp5.4をビルドしてみる
参考までに手元のマシンでのビルド結果
Hyper-VのVMで4GBメモリとCPU1コアを割り当てている(CPUは、Intel(R) Xeon(R) CPU L3426 @ 1.87GHz boost時3.2GHz)
ubuntu11.10
/usr/bin/time make 394.53user 24.84system 8:05.51elapsed 86%CPU (0avgtext+0avgdata 1274768maxresident)k 2296inputs+625480outputs (16major+19995025minor)pagefaults 0swaps
そして下がc1.mediumの普通のmake
/usr/bin/time make 247.98user 142.63system 6:29.62elapsed 100%CPU (0avgtext+0avgdata 979264maxresident)k 2256inputs+535168outputs (2major+15762296minor)pagefaults 0swaps
とりあえず1台のままdistccを試してみる。
/usr/local/etc/distcc/hosts へ 127.0.0.1 とだけ書き入れる
/usr/bin/time make -j10 CC="distcc gcc" CXX="distcc g++" 57.70user 147.89system 4:17.03elapsed 79%CPU (0avgtext+0avgdata 265200maxresident)k 0inputs+629400outputs (0major+14121531minor)pagefaults 0swaps
自分に対してdistccしても効果があるようだw
期待を膨らませつつ、
この状態のスナップショットを起動したまま取る。
(そのまえにsyncを実行)
webUIからポチポチとスナップショットをとってそこからイメージを作成
スナップショットもすぐに取れるのでお手軽です。早いときは数秒でスナップショット完了する。
作ったAMIで3台分追加で起動してみた。
ポチポチと。この辺はコマンドでやった方がいいんだろうけど・・。まあ3台程度であればWebからでもいいかなと。
ただし、セキュリティーグループは適切に設定する必要がある。
TCP3632を開けておくこと。
これで、まったく同じマシンが4台になったので、どのマシンからでも良いのだけど、
先ほど作業していた元のマシンで作業を続けます。
/usr/local/etc/distcc/hostsに追加起動したマシンのIPを追記
4台に増やしたから-j40に変更して実行しました。
/usr/bin/time make -j40 CC="distcc gcc" CXX="distcc g++" 57.75user 153.72system 2:29.77elapsed 141%CPU (0avgtext+0avgdata 265200maxresident)k 0inputs+620368outputs (0major+13968821minor)pagefaults 0swaps
早くなりました!
どこまで早くなるか試すためにさらに4台追加して試しました。
/usr/bin/time make -j80 CC="distcc gcc" CXX="distcc g++" 58.47user 157.69system 2:29.25elapsed 144%CPU (0avgtext+0avgdata 265216maxresident)k 0inputs+639544outputs (0major+14120097minor)pagefaults 0swaps
かわらねーw すでに4台のところで頭打ちだったようです。(-j15とか適当に減らしてもかわらない状態)
色々試した結果、hostsからlocalhost消して、別の2台のIPを追加した状態が
一番効率がよいという結果になりました。
57.74user 154.76system 2:25.63elapsed 145%CPU (0avgtext+0avgdata 265216maxresident)k 0inputs+622056outputs (0major+14116877minor)pagefaults 0swaps
このあたりはビルドするターゲットによって色々違うだろうとは思います。
distccにpumpモードというのがあるようなのでそちらも試したかったのですが、今日はここまで。