distcc と ccache で分散コンパイル

  • 投稿日:
  • by
  • カテゴリ:

PCが数台あるから分散コンパイルしたら速いかなとか思ってとりあえずテスト。

[distcc のインストール]
http://distcc.samba.org/
から
http://distcc.samba.org/ftp/distcc/distcc-2.18.3.tar.bz2
をダウンロード
tar xvf distcc/distcc-2.18.3.tar.bz2
cd distcc-2.18.3
./configure
make
make install

[ccache のインストール]
http://ccache.samba.org/
から
http://samba.org/ftp/ccache/ccache-2.4.tar.gz
をダウンロード
tar xvf ccache-2.4.tar.gz
cd ccache-2.4
./configure
make
make install

[~/.bashrc]
以下を追加
export DISTCC_HOSTS='localhost 192.168.0.3' <参加させり鯖の追加。先頭が優先されるらしい。
export CCACHE_DIR=/tmp/cache
export CCACHE_LOGFILE=/tmp/cache/ccache.log
export PATH=/usr/lib/ccache/bin:$PATH
export CCACHE_PREFIX="distcc"

シンボリックリンクを作成
[/usr/lib/distcc/bin]
[root@oscar2 tmp]# cd /usr/lib/distcc/bin
[root@oscar2 bin]# ln -s /usr/local/bin/distcc c++
[root@oscar2 bin]# ln -s /usr/local/bin/distcc cc
[root@oscar2 bin]# ln -s /usr/local/bin/distcc g++
[root@oscar2 bin]# ln -s /usr/local/bin/distcc gcc

[root@zephel2 bin]# ls -al
lrwxrwxrwx 1 root root 21 2月 7日 12:28 c++ -> /usr/local/bin/distcc*
lrwxrwxrwx 1 root root 21 2月 7日 12:28 cc -> /usr/local/bin/distcc*
lrwxrwxrwx 1 root root 21 2月 7日 12:28 g++ -> /usr/local/bin/distcc*
lrwxrwxrwx 1 root root 21 2月 7日 12:28 gcc -> /usr/local/bin/distcc*

[/usr/lib/ccache/bin]
[root@oscar2 bin]# pwd
/usr/lib/ccache/bin
[root@oscar2 bin]# ln -s /usr/local/bin/ccache c++
[root@oscar2 bin]# ln -s /usr/local/bin/ccache cc
[root@oscar2 bin]# ln -s /usr/local/bin/ccache g++
[root@oscar2 bin]# ln -s /usr/local/bin/ccache gcc

[root@oscar2 bin]# ls -al
lrwxrwxrwx 1 root root 21 2月 7日 21:21 c++ -> /usr/local/bin/ccache*
lrwxrwxrwx 1 root root 21 2月 7日 21:21 cc -> /usr/local/bin/ccache*
lrwxrwxrwx 1 root root 21 2月 7日 21:21 g++ -> /usr/local/bin/ccache*
lrwxrwxrwx 1 root root 21 2月 7日 21:21 gcc -> /usr/local/bin/ccache*

[/etc/init.d/distccd]
distccd を作成。
#!/bin/sh
#
# chkconfig: - 60 20
# description: The distcc deamon
# http://distcc.samba.org
#
# 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
/usr/local/bin/$SERVICE --daemon --allow 192.168.0.0/24
RETVAL=$?
echo
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/$SERVICE
return $RETVAL
}

stop() {
echo -n $"Stopping $SERVICE: "
#killproc $SERVICE
killall $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}"
echo $"Usage: $0 {start|stop|restart}"
exit 1
;;
esac

exit $?

でコンパイル時に
make -j9 (j n=CPUx2+1です)たとえばDaulCore の場合は2x2+1 = 5になります。

実際に振り分けられてるかの確認は
distccmon-text 1 (最後の1は1秒間隔という意味です)