kernelのコンパイルが途方もなく時間がかかるので、分散コンパイルはできないものかと調べたらdistccという物があるんですな。
早速インストールして試してみましょうか。
●環境
サーバーとクライアント共にCentOS6.0 64bit
# uname -a
Linux ABCDEF01 2.6.32-71.29.1.el6.x86_64 #1 SMP Mon Jun 27 19:49:27 BST 2011 x86_64 x86_64 x86_64 GNU/Linux
インストールしないといけないパッケージ
サーバー(計算ノード)
http://pkgs.repoforge.org/distcc/distcc-server-2.18.3-2.el6.rf.x86_64.rpm
http://download.fedora.redhat.com/pub/epel/6/x86_64/ccache-3.1.4-4.el6.x86_64.rpm
クライアント(コンパイルしたいマシン用 司令機)
http://pkgs.repoforge.org/distcc/distcc-2.18.3-2.el6.rf.x86_64.rpm
http://download.fedora.redhat.com/pub/epel/6/x86_64/ccache-3.1.4-4.el6.x86_64.rpm
適当にwgetで落としてください。
お約束
全てのマシンでgccのバージョンを一致させておく必要があります。
OSとかは異なってもいいらしい
たぶんdistccのバージョンも一致させておく必要があると思う。
クライアントにだけライブラリとかが必要になります。
インストール方法
rpm -ivh でインストールする。
サーバー
# rpm -ivh ccache-3.1.4-4.el6.x86_64.rpm
# rpm -ivh distcc-server-2.18.3-2.el6.rf.x86_64.rpm
クライアント
# rpm -ivh ccache-3.1.4-4.el6.x86_64.rpm
# rpm -ivh distcc-2.18.3-2.el6.rf.x86_64.rpm
インストールが終わるとサーバーに下記にファイルが生成されます。
# /etc/rc.d/init.d/distccd
サーバー設定ファイルの修正
設定ファイルの場所
# /etc/sysconfig/distccd
とりあえず設定してみる。
# vi /etc/sysconfig/distccd
オリジナルファイルはこんな内容らしい
## See distcc(1) manual page for more information on these options.
###
#OPTIONS=”–nice 5 –jobs 5 –allow 10.0.0.0/24 –port 1234″
#USER=”distcc”
### Set this if don’t want distccd to use gcc or g++ by accident.
#DISTCCPATH=”/usr/lib/distcc/bin”
以下のように書き換えました。
### See distcc(1) manual page for more information on these options.
###
OPTIONS=”–nice 0 –jobs 6 –allow 172.0.0.0/24 –port 3632″
#USER=”distcc”
### Set this if don’t want distccd to use gcc or g++ by accident.
#DISTCCPATH=”/usr/lib/distcc/bin”
allowは許可するネットワークアドレスとマスク長です。
niceはdistccdの実行優先度です。(低い数値ほど優先される)
jobsはコンパイル命令のスレッド数。(CPUコア数*2+1~4)
portは待ち受けポート番号(標準はTCP3632)
マシンスペックと相談してください。
とりあえず起動してみる
# service distccd start
起動確認
# ps -aef | grep distcc
distcc 2191 1 0 16:21 ? 00:00:00 distccd –daemon –log-file=/var/log/distccd.log –nice 0 –jobs 6 –allow 172.0.0.0/24 –port 3632
distcc 2192 2191 0 16:21 ? 00:00:00 distccd –daemon –log-file=/var/log/distccd.log –nice 0 –jobs 6 –allow 172.0.0.0/24 –port 3632
ログは/var/log/distccd.logだそうです。
●おまけ 単体で起動するコマンド
distccd –daemon –listen=172.0.0.1 –allow=172.0.0.0/24
サーバークライアント共通の操作
ファイアーウォールをオフ
SELinuxをオフ
※テストなんで無効にしたけど危険なのでやめてね
クライアントでの操作
環境変数にサーバーのIPアドレスを登録します。
export DISTCC_HOSTS=’172.0.0.1 172.0.0.2 172.0.0.3 localhost’
左側にあるホストから優先して使用されていくそうです。
自分もコンパイルに参加する場合はlocalhostと書きます。ループバックアドレスだとNICを経由するため効率が落ちるらしいよ。
早速試してみる。
試しにカーネルのコンパイルをしてみます。
# alias make=’make -j20 CXX=distcc CC=distcc’
# make bzImage
成績
PC2台+仮想マシン1台(合計物理6コア 論理8コア クライアントは参加せず)
5分50秒
クライアントのみ(Pentium D 2800 2.8G)
11分57秒
追試結果
実行コマンド
# date
# make bzImage
# make modules
# date
PC2台+仮想マシン1台(合計物理6コア 論理8コア クライアントは参加せず)
22分40秒
クライアントも参加した場合
22分26秒
クライアントのみ(Pentium D 2800 2.8G)
48分59秒
サーバーとクライアントのコンパイルスレッド数を予め増やしておいたほうが効率が上がるような気がします。
だいたい半分になりましたけど、コンパイル時間がかかるものほど並列コンパイルの方が有利になると思います。
参加するPCが多いほど速くなるだろうけど、多分ネットワークの飽和とかライブラリのリンクとかで時間かかると思う。
distccのバージョン3以降はpumpモードが付いてるので、もう少し効率がいいそうです。
1CPUにつき同時20スレッドとかのモンスター級サーバーなら胸が熱くなるスピードで終わるんだろうな…
-
最近の投稿
最近のコメント
アーカイブ
- 2020年1月
- 2019年1月
- 2017年1月
- 2016年11月
- 2016年10月
- 2016年7月
- 2016年6月
- 2016年3月
- 2015年10月
- 2015年7月
- 2015年6月
- 2015年5月
- 2015年4月
- 2014年12月
- 2014年11月
- 2014年10月
- 2014年7月
- 2014年6月
- 2014年5月
- 2013年11月
- 2013年7月
- 2013年6月
- 2013年1月
- 2012年11月
- 2012年10月
- 2012年8月
- 2012年5月
- 2012年4月
- 2011年11月
- 2011年10月
- 2011年9月
- 2011年8月
- 2011年7月
- 2011年6月
- 2011年3月
- 2011年2月
- 2011年1月
- 2010年12月
- 2010年8月
カテゴリー
メタ情報