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倍以上の速度がでました. カーネルに限らず、大変有用ですね.