Distcc/ja

Distccはネットワーク上のホストで分散コンパイルを行うためのプログラムで、サーバー側であるとクライアント側であるで構成されています. またccache、Portage、Automakeとの連携もちょっとしたセットアップで可能となります.

Gentooのインストールにを使いたい場合は、ブートストラップに使うを参照してください.

インストール
を構築する前に、まずは使用するすべてのホストに パッケージが導入されているかどうか確認しましょう.

全てのホストで必要なこと
を使用するには、ネットワークのすべてのコンピュータのGCCが同じバージョンでなければいけません. 例を挙げますと、3.3.x(xは任意の数字)を混在させるのは問題ありませんが、3.3.xと3.2.xを混在させた場合はコンパイルエラーや実行時エラーが起きるかもしれません.

すべてのシステムが同じバージョンのbinutilsを使用しているか確認してください(eselect binutils list)．そうでないと，多くのパッケージがテキストリロケーションのような様々なエラーが出てリンクに失敗するでしょう.

Emerge
Distccには分散コンパイルしているタスクを監視するグラフィカルモニタが付属しています. USEフラグをセットすると、このユーティリティーを使えるようにできます.

USEフラグの設定が終わったらパッケージをインストールします.

サービス
を自動的に起動するためには、次の方法に従ってください.

OpenRC
を編集して  ディレクティブに信頼できるクライアントがセットされいるかどうかを確認してください. 例えば multi-homded　システムを採用しているなどのように、さらにセキュリティを高めるには  ディレクティブで  デーモンにどのIPを受け付けるのかを知らせください. のセキュリティについてもっと詳しく知りたいならば、Distcc security notes を参照してください.

次の設定例では、 と で実行されている distcc クライアントは、ローカルで実行されている サーバへの接続が許されます:

それでは、分散コンパイルに参加する全てのコンピュータで デーモンを起動しましょう:

systemd
ファイルを編集して、CIDR フォーマットにて許可するクライアントを追加してください. 192.168.1.xxxの範囲にあるすべてのIPアドレスを追加する例をあげますと:

このような変更した後は、ユニット・ファイルをリロードしましょう.

の自動起動を有効にして、サービスを開始します:

参加するホストを記述する
コマンドを使用すれば、ホストのリストを設定することができます.

ホストのリストの書き方の一例を下に記します. ほとんどのケースでは、１行目と２行目の書き方で十分でしょう. ２行目の書き方のように シンタックスを使えば、にこのノードで最大いくつのジョブを起動できるかを知らせることができます. distcc マニュアルページ では、3行目や4行目のような書き方の詳しい説明が載っています.

ホストをセッティングする方法にはここで挙げたほかにもいくつかやり方ありますので、詳細については、 man ページをご覧ください.

ローカルマシンでもコンパイル作業をさせたいのなら、ホストのリストに  と記入しましょう. 逆に、ローカルマシンにコンパイル作業をさせたくない場合には、リストから外しましょう. 遅いマシンでlocalhostを設定してると、実際すべてのことが遅くなってしまうでしょう. また、設定したものをテストするのも忘れないでください.

例の中の最初の一行目で書かれたホストを使用して、 の環境を設定してみましょう.

Distccは、コマンドを実行することで、pumpモードもサポートします. これは、複数のファイルが並行ビルドされる場合のビルド時間を大幅に減少させます. このモードは、プリプロセス済みのヘッダーをサーバー側にキャッシュし、結果としてこれらのヘッダーファイルが繰り返しアップロード・プリプロセスされないようにします.

ホストをpumpモード用に設定するには、  というサフィックスをホスト定義に加えます. pumpモードは  および   フラグを(ファイルがCであるかC++であるかに関わらず)必要とします.

Portageで使用する
Portage が を利用できるように設定するのは簡単です. feature を有効にして、同時にビルドに参加するジョブ数を設定する変数があるのですがこれに適当な数をいれてやるだけです (この数に従って はビルドするリソースの量を増やします).

下に示したように、 MAKEOPTS 変数と FEATURES 変数を設定してください.

一般的な戦略としては、
 * の値を「トータルの」(ローカルとリモートの)CPUコアの個数の2倍 + 1に設定し、
 * の値を「ローカルの」CPUコアの個数に設定します.

MAKEOPTS 変数で を使用すると過剰なタスクが起動されてしまうのを防ぐことができます. 例えば、クラスタホストのいくつかが利用できなくなった時(他のシステムでの並列ジョブの量が増加した場合)や、ebuild でリモートビルドを禁止している時(gccなど)です. この仕組みは、システム負荷が 値以上になった時に、それ以上のジョブの追加を拒否することによって行われます.

例えば、４コアＰＣのホスト２台と２コアＰＣのローカルがあったと仮定しましょう. すると MAKEOPTS 変数は次のようになります.

CFLAGS と CXXFLAGS
ファイルを編集するとき、 CFLAGS や CXXFLAGS 変数で を設定してはいけません. これはよく確認してください. が に設定されていると、は作業を他のマシンにうまく分散しなくなるでしょう. そのかわり、次のコマンドを実行すれば適切な の値やだいたいのマシンフラグのセットを得ることができます:

詳しくは、 Inlining  for distcc をご覧ください.

GCCのバグは、適切なマシンフラグを推定するためのより信頼性が高く簡潔なメカニズムを促進する8.0 devツリーにて最近修正されました. この修正は 6 および 7 ブランチにバックポートされており、かなり近いうちにリリースされるはずです. それでもいくつかの処理はまだ必要であり、スクリプトは distccflags repo あるいは wgetで見つけることができます:

automake で使用する
これは、場合にもよりますが、Portageのセットアップよりも簡単です. PATH 変数の のあるディレクトリよりも先頭にを書き込むだけでよいのです. ただし、ちょっと注意が必要です. もし をご使用の場合は、の後にを配置してください:

これをユーザの 等のようなファイルに書き込んでおき、ユーザがログインするたびに設定されるようにしておきましょう. もしくは、 ファイルに書き込んでグローバルに設定するのもよいかもしれません.

何もつけずにを呼び出すより、 ( は整数)をつけましょう. は、コンパイルに使用するコンピュータのネットワークとタイプによって違います. このアーティクルの最初のところで適切な値の見つけ方をすでに書いておきましたのでご参考ください.

ブートストラップに使う
をブートストラップに使う（たとえば、システムの残りをインストールする前にワーキングツールチェーンをビルドする）には、いくつか手間をかける必要があります.

Step 1: Portage の設定
Gentoo Linux LiveCDで新しくマシンを立ち上げてinstallation instructionsに従ってください. さらに、ブートストラップについての情報もGentoo FAQにありますので参考にしましょう. その次にを使用してPortageを初期設定してください.

インストレーションセッションで PATH 変数を次のように更新:

Step 2: distcc をゲット
をインストール:

Step 3: distcc のセッティング
を実行してdistccをセットアップしましょう. 例中の には実際のIPアドレスやホスト名を入れてください.

これでdistccはブートストラップ用に新しく設定されました. 以降はインストレーションの手順に従ってください. の後にを実行するのをお忘れなく. これは、すべての必要な依存関係のあるパッケージがインストールされているのかを確認するために行います.

付属するツール群
アプリケーションには、環境での作業をサポートするための機能やアプリケーションがあります.

監視ユーティリティ
Distccには2つの監視ユーティリティが付属しています. テキストベースの監視ユーティリティは で、必ずビルドされます. 最初に実行するときは少々混乱するかもしれませんが、実際とても簡単に使うことができます. パラメータなしで実行したときは、プログラムは1回だけ実行されますが、引数に を渡すと、N秒ごとに更新が行われます.

もうひとつの監視ユーティリティは  USE フラグがセットされた時のみ有効になります. これはGTK+ベースで、X環境で動作し、なかなか良い外見をしています. Gentooでは、このGUIモニタは混乱を避けるため にリネームされています(もともとの名前は です).

Portageでのの使用をモニタするには:

DISTCC_DIR を環境変数にセットするための良い方法：

ここで、環境を更新します:

最後に、GUIアプリケーションを起動しましょう.

SSH 通信
SSH経由のdistccをセットアップする場合、いくつかの落とし穴があります. まず、SSHの鍵ペアをパスワードをセットアップせずに生成してください. portageはプログラムをPortageユーザー(または、  がセットされていない場合にはroot)としてコンパイルすることに注意してください. Portageユーザーのホームフォルダーは であり、これは鍵を  に保存しておく必要があることを意味します.

次に、SSH設定ファイルに各ホスト用のセクションを作成します:

公開鍵を各コンパイルノードに送信します:

また、各ホストが ファイルに含まれていることを確認します:

ファイルの所有者を以下のように修正します:

と  というホストをセットアップするには、以下を実行します:

distccにsshホストを指定する、 (@ マーク)に注意してください.

最後に、distccにどのSSHバイナリを使うか指示します:

がSSH経由で通信する場合、ホスト側でのinitスクリプトを実行しておく必要はありません.

テスト
をテストするには、簡単なHello distccプログラムを書いてをverboseモードで実行し、正しく通信できているか確認します.

次に、verboseモードを有効にしてからdistccを使ってプログラムをコンパイルし、生成されたオブジェクトファイルをリンクして実行可能ファイルにします.

distccの設定の探索、接続するホストの選択、接続の開始、そして最後に のコンパイルについて、一連の出力があるはずです. 出力の中で使いたいホストがリストされない場合、設定を確認してください.

最後に、コンパイルされたプログラムが正しく動作するか確認してください. ホストそれぞれについてテストするには、hostsファイルで各コンパイルホストを列挙してください.

トラブルシューティング
をご使用中に問題が発生したときには、このセクションをお読みになれば問題解決の糸口となるかもしれません.

ERROR: failed to open
2015年1月22日以降、emergeすると に適切な  ファイルを作るのに失敗します. これは、 distcc ver.3.1-r8 のみに起こることが明らかにされています. このバグは現在修正中ですが(参照:)、手作業でそのログファイルを作成し、適切な所有者を設定し、distccデーモンを再起動することで何とかうまく動くようにできます.

次に、にあるコンフィグレーションファイルのの値を先ほど作成したディレクトリに更新してください：

最後に distccd サービスを再起動します.

distccをつかえないパッケージもあります
様々なパッケージをインストールしていく中で、分散されない（並列にビルドできない）パッケージがあることに気づくでしょう. これは、そのパッケージのが並列オペレーションをサポートしていない、あるいはそのebuildのメインテナーが既知の問題があるために並列オペレーションを禁止しているからだと思われます.

時として、はパッケージのコンパイルに失敗することもあります. このようなことが起こりましたら、お手数ですが報告してください.

GCC のバージョンが混在する場合
もしdistcc環境のホスト間でGCCのバージョンが違っていたら、奇怪な問題が起こるかもしれません. 解決法は、すべてのホストが同じバージョンのGCCであることをしっかり確認することです.

最近のPortageのアップデートでは、 のかわりに (minus gcc)を使うようになっています. しかしながらこのことは、もしi686マシーンがほかのタイプのマシーン(i386,i586)と混在していた場合には、ビルドが失敗に終わってしまうことになります. この問題に対しては、次の対処をするとよいかもしれません:

の CC と CXX 変数を上記のようにセットしてもよいでしょう.

-march=native
GCC 4.3.0よりコンパイラは オプションをサポートするようになりました. これは、CPU自動判別と最適化の機能を有効にするものでで、GCCが実行されているプロセッサに対しては有効にしておく価値のあるものです. しかしながら、そのオプションでを使用した場合には、一つ問題が引き起こされます. 理由はそれぞれのプロセッサでの最適化されたコードが混在してしまうからです. 例を挙げますと、 とともにを実行するとき、あるシステムでは AMD Athlon プロセッサで、別のシステムでは Intel Pentiumプロセッサの場合、両方のプロセッサのコンパイルしたコードが混在してしまうのです.

次の注意を心に留めておきましょう:

詳細については、 CFLAGS と CXXFLAGS 節 や Inlining  for distcc を参照してください.

emerge のログからより多くの出力を得る
verboseモードを有効にすることで、より多くのログを取得することができます. これは DISTCC_VERBOSE を に追加することによって実現できます.

これで、詳細なログが で見られるようになります.

で見られる最初のの実行は、必ずしもビルドプロセス中の最初のの実行であるとは限らないことを覚えておいてください. たとえば、ビルドサーバーは、コンパイラーを使ったチェックがいくつか実行された場合にconfigurationの段階で1分間のバックオフ期間に入る可能性があります(はリモートサーバーでのコンパイルが失敗すると、それがローカルマシンでも失敗したかどうかに関わらずバックオフ期間を設定します).

こうした状況を調査するには、 ディレクトリに入ってください. 他のログを探すか、あるいは作業ディレクトリの中から明示的にを呼び出します.

もう一つの使うと興味深い変数は DISTCC_SAVE_TEMPS です. 設定されている場合、リモートのコンパイラーからの標準出力/エラー出力を保存します. Portageビルドでは、結果は ディレクトリにあるファイルに保存されます.

参考
DistCC Cross-compiling guideには、を使ってどのようにあるアーキテクチャから別のアーキテクチャのプラグラムをビルドするかの説明があります. Athlon(i686)を使ってK6-2(i586)のプログラムをビルドしたり、SPARCを使ってPowerPCのプログラムをビルドをするように簡単に行うことができます.

外部の情報

 * Inlining  for distcc
 * Distcc homepage