yamasaki0's diary

IT勉強会や技術的なメモなどを書いていきたいと思います。

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モードというのがあるようなのでそちらも試したかったのですが、今日はここまで。