distccを用いた分散コンパイル環境の構築

カーネルを触っていると、コンパイル時間が開発のボトルネックになってしまうことがあります. この問題を解決するために、distccを用いた分散コンパイル環境を構築してみました. なお、ファイルパスなどはすべてubuntuのものとなっており、分散先のマシンのgccのバージョンは一致している必要があります.

debパッケージをインストールする

distccをdebパッケージ経由でインストールします. 今回インストールしている ccache は今回の件には直接関係はないのですが、メモリ上にコンパイル済みのオブジェクトを保持しておき、コンパイル速度を早める効果があるため、ついでにインストールしてみました.

 $ aptitude install distcc ccache

設定ファイルを書く

/etc/default/distcc が設定ファイルです. このファイルに設定を書くことで、distccデーモン起動時、明記的にオプションを与える必要がなくなります.

# Defaults for distcc initscript
# sourced by /etc/init.d/distcc

#
# should distcc be started on boot?
#
# STARTDISTCC="true"

STARTDISTCC="true"

#
# Which networks/hosts should be allowed to connect to the daemon?
# You can list multiple hosts/networks separated by spaces.
# Networks have to be in CIDR notation, f.e. 192.168.1.0/24
# Hosts are represented by a single IP Adress
#
# ALLOWEDNETS="127.0.0.1"

# 同一LAN内からのコンパイル要求を通過させる
ALLOWEDNETS="127.0.0.1 192.168.1.0/24"

#
# Which interface should distccd listen on?
# You can specify a single interface, identified by it's IP address, here.
#
# LISTENER="127.0.0.1"

# Listen するインターフェースのIPアドレスを指定する.
# 空文字にするとすべてのインターフェースでListenを行う.
LISTENER=""

#
# You can specify a (positive) nice level for the distcc process here
#
# NICE="10"

NICE="10"

#
# Enable Zeroconf support?
# If enabled, distccd will register via mDNS/DNS-SD.
# It can then automatically be found by zeroconf enabled distcc clients
# without the need of a manually configured host list.
#
# ZEROCONF="true"

ZEROCONF="true"

環境変数の設定

処理を分散させたいホスト名を、環境変数 DISTCC_HOSTS にスペース区切りで指定します.

export DISTCC_HOSTS='localhost machine1.hoge.net machine2.hoge.net'

コンパイルしてみる

  • 何もない場合
$ make -j4 bzImage CC="ccache gcc"
real    6m6.095s
user    10m45.380s
sys     1m0.672s

Core 2 Duo machine 2GHz memory 2GB
  • distccを用いた場合
$ make -j40 bzImage CC="ccache distcc"
real    2m38.123s
user    3m33.881s
sys     0m43.043s

Core i7 2.66GHz memory 12GB
Core 2 Duo  3GHz memory 4GB x 3
Core 2 Duo  2GHz memory 2GB

素晴らしい!2倍以上の速度がでました. カーネルに限らず、大変有用ですね.