distccでカーネルの並列コンパイル(CentOS6.0 64bit)

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スレッドとかのモンスター級サーバーなら胸が熱くなるスピードで終わるんだろうな…









カテゴリー: Linux, コンピュータ, ネットワーク パーマリンク

コメントは停止中です。