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
を編集して  ディレクティブに信頼できるクライアントだけが許可されるように設定されいるかどうかを確認してください. さらにセキュリティを高めるには  ディレクティブを使ってどのIPを受け付ければ良いのかをデーモンに知らせください(multi-homed システムを採用している場合). のセキュリティについての詳細は、Distcc security notes を参照してください.

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

When logging to a file in, create the log and give appropriate permissions:

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

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

Or an example with multiple clients and a manually specified log-level

To set the proper environment variables for, place them into. For example,

For workaround, you need to edit distccd.service by running the following command.

This will open up an editor. Change the line with  directive to

Alternatively, you could also write a shell script wrapper for.

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

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

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

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

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

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

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

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

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

Hosts also need to be in:

Optionally, to set the maximum number of threads used by a host, add a forward slash "/" after each host:

The same applies to the command. If the maximum threads number is not specified, it will default to 4.

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

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

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

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

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

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

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

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

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

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

With ccache
To make Ccache work with, some prerequisites must be fulfilled:
 * Ccache is successfully set up locally
 * Distcc is successfully set up on the desired hosts

The following setup will work as follows:

Configure distccd
In order to let the daemon use, it must masquerade the path  with. Furthermore, when it uses, should use the prefix  :

Additionally must be aware of the environment variables DISTCC_DIR and CCACHE_DIR :

Next, update the environment variables:

Finally, restart the daemon to adapt all changes:

Configure ccache
First, prepare the cache directories:

The second command will create the first level directories from  to,  to  and. The following loop will then look for the first level directories, excluding the current directory  and. It then descends into each of them, creates the second level directories from to  and  to   and goes back to the previous directory , which is.

When the preparation is done, every directory - including the directory itself - must be owned by the user  :

Configure portage
To use with  and, make sure, that both features are enabled and that CCACHE_DIR is set in :

It might be redundant to set CCACHE_DIR here, since it is already defined in, mentioned here. But to make absolutely sure, configure it like that.

Remote
First enable verbose logging by setting  to   in :

After that, restart the daemon to adapt the changes:

Also check, if there are directories in - including the directory  itself - which are not owned by the user   and correct their owner permissions:

Client
Make sure, that the following environment variables are present in the current shell:

After that, navigate to a temporary directory within and compile the example mentioned below:

This will provide a verbose output, while also keeping temporary files receiving from the remote site in by default:

Any occuring error from the remote site are saved in.

If the compilation was successful, the following line will be shown.

On the remote site, it will look like this:

The important part here, is, that any symlink of is a save symlink to.

Also, on the remote site, there should be the cached file in, assuming, the example with its filename was copied from this wiki article. Generally, one can monitor the ccache size using, while compiling.

Testing distcc with ccache using emerge
Check, if necessary environment variables are present for the current shell, see here and that was configured properly, see here.

To produce some cached files on the remote site, one can compile small packages like  and   on the client:

Future usage
Make sure, that the following environment variables are always set in the desired shell:

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

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スクリプトを実行しておく必要はありません.

Reverse SSH
As an alternative to distcc's built-in SSH solution, a compiling server can connect to the distcc client via SSH, redirecting the client's distcc TCP port to the compiling server. There is no need for password-less SSH keys on the client.

Note that distcc uses as a literal keyword for special purpose so that  has to be used instead. For multiple compiling servers each needs its own port redirection on the client (e.g. 127.0.0.1:4000, 127.0.0.1:4001 etc). Assert that IP addresses and ports are listed in on the client.

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

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

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

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

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

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

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

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

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

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

Rust package is known to cause excessive IO utilization as --local-load is ignored and --jobs is usually too high for local build resources. A package.env needs to be provisioned with non-distcc MAKEOPTS values to workaround this behaviour.

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 を参照してください.

Network is unreachable
Due to network restrictions introduced by the feature, you may run into this issue. Since contradicts with this security feature, you have to disable it:

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

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

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

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

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

Failed to create directory /dev/null/.cache/ccache/tmp: Not a directory
This error can be discovered from the standard error output file in the server if you set DISTCC_SAVE_TEMPS. It only occurs when using with.

Likely, it is because CCACHE_DIR is not properly set, or not passed correctly to. will then default to as its cache folder. However, is run by  under user distcc, which is a non-login account. See systemd section and With ccache section for setting CCACHE_DIR.

Portage build failing with errors that are apparently not connected with distcc at all
When builds are failing with errors that do not seem to be connected to distcc, but the build works with FEATURES="-distcc", it has been reported that builds sometimes fail because of DISTCC_VERBOSE=1. Try the build with DISTCC_VERBOSE=0.

外部の情報

 * Inlining  for distcc
 * Distcc homepage