2005/09/24

あれげメモ:Debianのカーネルパッケージをdistccで快適にコンパイル

なんとなくdistccでネットワーク分散コンパイルしたくなったので、いろいろ試行錯誤した結果をメモ。

用意するもの

  • 悪役1号。分散コンパイルクライアント。C3(Samuel)-800MHzの遅いPC。Debian sargeを放り込んでファイルサーバとして運用中。
  • 悪役2号。Athlon MP 2800+デュアルPC。Windows 2000 Professionalインストール済み。
  • Microsoft Virtual PC 2004 SP1。悪役2号上のゲストOSの方が悪役1号より速い(涙)。
  • Debian sarge。今回使うOS。悪役1号および悪役2号上で動作するVirtual PCゲストOS「vpc-Linux」にインストール済み。
  • kernel-source-2.6.8。当然。
  • kernel-package。言うまでもなく。
  • gcc他開発ツールいろいろ。あたりまえですが。
  • distcc。必要です。
  • Virtual PCのゲストOS「vpc-Linux」分散コンパイルサーバ。エミュの癖にC3-800MHzより速い。割り当てメモリ512MB。

分散コンパイルクライアント「悪役1号」での設定

distccをインストールしてdistccdを起動したら、環境設定をする。

コンパイラの差し替え

Debianの場合、PATH環境変数は標準で/usr/local/binが/usr/local/binより優先されるようになっている。したがって、gccの代わりにdistccを使うべく(今回はg++は使わないからgccのみ弄る)、以下のコマンドを実行する。


cd /usr/local/bin
ln -s ../../bin/distcc ./gcc
環境変数の設定

make-kpkgで並列コンパイルを行うために環境変数CONCURRENCY_LEVELを定義する。今回は4にしておいた。これでmake-kpkgから呼び出されるmakeは「-j4」オプション付きで実行され、最大4つのファイルを並列でコンパイルすることになる。分散コンパイルサーバのCPU使用率がスカスカだったので、もっと多くても良いような気がしないでもない。

export CONCURRENCY_LEVEL=4
分散コンパイルサーバの設定

次は「どのコンピュータで分散コンパイルを行うか」を設定する。具体的にはDISTCC_HOSTS環境変数を設定するだけ。DISTCC_HOSTSには分散コンパイルサーバをスペースで区切って並べるだけ。ちなみに優先順位は先に書いたサーバの方が高いので、速い(or 空いている)順に書き並べていくのが良いと思う。今回は本物PCより速い仮想PCがあるので、そっちを優先して使うことにする。

export DISTCC_HOSTS=vpc-Linux localhost

以上で分散コンパイルクライアントの設定はおしまい。

分散コンパイルサーバ「vpc-Linux」の設定

distccインストール時に行う設定については省略する。クライアント側とコンパイラその他のバージョンを合わせ、distccdを起動する。以上で設定は終了。

distccモニタの起動

再びクライアントに戻って、分散コンパイルモニタを実行する。Xが動くならdistccmon-gnome, 端末から見るのであればコンソール版のdistccmon-textを実行する。今回はsshでリモートからクライアントを操作しているのでコンソール版を使用することにして以下のコマンドを実行する。引数は秒単位の更新間隔なので、以下のコマンドの場合は1秒ごとに情報が更新される。

distccmon-text 1

お待ちかねの分散コンパイル

設定を確認した上でmake-kpkgを実行すればネットワーク分散コンパイルがさくさく進み、しばらくするとカーネルパッケージが出来上がり。

今後の課題

  • Virtual PCみたいなフルセットの仮想環境はオーバーヘッドがでかいので、XenとかcoLinux, QEMUあたりでオーバーヘッドを減らして高速化を図る。
  • ccacheと組み合わせてもっと速く。

0 件のコメント: