distccによる分散コンパイル

http://hp.vector.co.jp/authors/VA013651/freeSoftware/distcc_ja.html
■distccとは?
googleの分散ビルドシステムとして採用されているもの。
gccのバージョンさえ合っていれば、ホスト間でライブラリの共有をしなくて良い点がイケているところ。
※distccは分散コンパイルに参加させるすべてのマシンにインストールする必要がある。
よって、以下の手順はすべてのマシンで行う。


■gccアップグレード
http://www.taperium.com/wordpress/tech/5260.html を参考にgccのバージョンを4.3.3にアップグレードしておく。


■Pythonインストール
Python2.4以上がインストールされていない場合は下記手順でインストール。
http://www.python.org/download/より、 Python-2.6.2.tgzを落としてくる。

$ tar zxvf Python-2.6.2.tgz
$ cd Python-2.6.2
$ ./configure --prefix=/usr/local
$ make
# make install

■distccインストール手順
http://code.google.com/p/distcc/downloads/list より distcc-3.1.tar.gzを落としてくる。

$ tar zxvf distcc-3.1.tar.gz
$ cd distcc-3.1
$ ./configure --sysconfdir=/etc
$ make
# make install

なお、pythonを/usr/local以外にインストールしている場合は、makeでエラーになる場合があるので、その際はconfigureでPYTHONを使ってpythonバイナリの位置を指定する。

$ ./configure --sysconfdir=/etc PYTHON=/usr/local/python/bin/python

■分散コンパイル対象マシンの指定
/etc/profileを開き

export DISTCC_POTENTIAL_HOSTS="host1 host2 host3" ←追加
export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE INPUTRC ←既存

として保存。
DISTCC_POTENTIAL_HOSTSは先に書いたマシンを優先的に分散コンパイルを行う。
よって、高速なマシンを先頭に書いたほうがよい。
また、対象マシンの数が増えてきた際は、自ホストは除外した方がよい。
現在は、マシン数が少ないので自ホストも追加している。
自ホストを指定する際は、localhost、127.0.0.1と記述するとなぜかうまく動作しないので、ホスト名を記述すること。
保存後、

$ source /etc/profile

で設定を反映。


■ユーザdistccの追加
distccdの起動に、ユーザdistccが必要なので追加。

# useradd distcc

■起動スクリプトの作成

# cp /usr/local/share/doc/distcc/example/init /etc/init.d/distccd
# chmod +x /etc/init.d/distccd

startの–daemon の後に–allow 10.0.0.0/8だけ追加
参考までに、上記ファイルをベースに自作したdistccdの起動スクリプトは以下。

#! /bin/sh
#
# chkconfig: - 60 20
# description: The distcc deamon
#              http://code.google.com/p/distcc/
#
# processname: distccd
# This is a Red Hat init.d file to start distccd.  To install it, copy
# it into /etc/init.d/distccd, and add appropriate links into the
# rc?.d directories.
# It may need to be tweaked for other distributions or versions.
# You may wish to accept parameters from the user to set access
# control options.
# Get config.
. /etc/sysconfig/network
# Get functions
. /etc/init.d/functions
# Check that networking is up.
if [ ${NETWORKING} = "no" ] ; then
        exit 0
fi
RETVAL=0
SERVICE=distccd
start() {
        echo -n $"Starting $SERVICE: "
        daemon /usr/local/bin/$SERVICE --daemon --allow 10.0.0.0/8
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE
        return $RETVAL
}
stop() {
        echo -n $"Stopping $SERVICE: "
        killproc $SERVICE
        RETVAL=$?
        echo
        [ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/$SERVICE
        return $RETVAL
}
restart() {
        stop
        start
}
# See how we were called.
case "$1" in
 start)
        start
        ;;
 stop)
        stop
        ;;
 status)
        status $SERVICE
        ;;
 restart)
        restart
        ;;
 condrestart)
        [ -f /var/lock/subsys/$SERVICE ] && restart || :
        ;;
 *)
        echo $"Usage: $0 {start|stop|status|restart}"
        exit 1
        ;;
esac
exit $?

■serviceコマンドに登録

# /sbin/chkconfig distccd on

■起動

# /sbin/service distccd start

■使い方

$ time pump make -j16 CC="distcc /usr/local/bin/gcc_4.3.3" CXX="distcc /usr/local/bin/g++_4.3.3"

※フルパスでgcc、g++を指定しないと、なぜか/usr/bin配下のgccでビルドされるので気をつけてください
オープンソースについてはビルドエラーになるものもあるが、CCやCXX周りの設定によるものだと思うので、調査中。
-j16の部分はジョブ数を表しており、分散コンパイルに参加している合計CPUコア数×2ぐらいが最適値といわれている。あまり多く設定しすぎても、待ちが発生してビルド速度が落ちるようだ。


■注意点
gccのバージョンは合わせる必要があります。
4.1.xの違いはOK。
4.x.xの違いはNG。


■動作確認はどうやって?
デフォルトでは/var/log/messagesにログが出力されます。

$ watch distccmon-text

とすることで、現在、どのホストでどのソースを処理しているかをリアルタイムで確認することも可能。


■VirtualBox上で使用する場合
・クライアントとして使う場合
特にやることはありません。
・サーバとしてビルドグループに追加する場合
他のdistccサーバからのアクセスを許可するために、distccdの使用ポート3632へのポートフォワーディング設定が必要です。
VirtualBox仮想マシンの設定画面にて、「ネットワーク」→「アダプタ1(NATを割り当てているもの)」→「ポートフォワーディング」
名前:Rule1
プロトコル:TCP
ホストIP:ホストOSのIPアドレス
ホストポート:3632
ゲストIP:空欄
ゲストポート:3632

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です