distccのサーバ/クライアント設定

August 08, 2021

distcc サーバーを建てる

概要

ラズパイ Gentoo GenPi64 でのコンパイルに時間がかかるので、 amd64 のマシンの docker 上にクロスコンパイル環境を構築、 distcc デーモンを立てて、ラズパイがクライアント、amd64 が distcc サーバの構成でコンパイルを早くした。

手順

distcc が起動する docker コンテナを作る

distcc への接続確認

telnet コマンドでポート 3632 に接続。 切断は Ctrl + ] を押してから Ctrl + d

$ telnet localhost 3632
Trying ::1...
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
^]
telnet> Connection closed.

GenPi64 distcc クライアント側の設定

GenPi64 は distcc はインストール済みなので emerge は不要。ただし

  1. gcc のプロファイルを揃える
  2. distcc サーバーの IP アドレスの追加 は必要。

gcc のプロファイルを確認

gcc-config --list-profiles

distcc サーバーとずれている場合は

gcc-config 1

などでプロファイルを選択する( gcc-config の結果によっては数字が異なる場合もある )

/etc/distcc/hosts に distcc サーバーの IP アドレスを追加。

/etc/portage/make.conf の FEATURES に distcc を追加。

distcc を emerge する場合

GenPi64 は最初から distcc がインストール済みなので不要だが、自分でコンパイルする場合は下記の手順になる。

vi /etc/portage/make.conf

2021/08/07 make.conf の MAKEOPTS の値を CPU + 1 程度にする。

MAKEOPTS="-j5 -l5"
echo "sys-devel/binutils -~arm64" >> /etc/portage/package.accept_keywords
echo "sys-devel/gcc -~arm64" >> /etc/portage/package.accept_keywords
emerge -u sys-devel/binutils sys-devel/gcc
gcc-config --list-profiles

gcc-config --list-profiles で確認できるバージョンは distcc のデーモンと揃える。 だいたいは[1]が最新になる。

gcc-config 1
env-update && source /etc/profile
emerge --oneshot sys-devel/libtool
emerge sys-devel/distcc

/etc/distcc/hosts に distcc サーバーの IP アドレスを追加する。

cpp, lzo のオプションについて

クライアント側で /usr/bin/distcc-config —set-hosts “10.10.254.17,cpp,lzo” を追加したが、2 回目以降の portage で “INCLUDE_SERVER_PORT not set - did you forget to run under ‘pump’?” というエラーが出た。 https://wiki.gentoo.org/wiki/Distcc/ja によると

distcc-pumpは複数のパッケージを予期しない方法で破壊することが知られています。
どんなことがあってもdistcc-pumpをシステム全体で使用しないでください。distcc-pumpが有効な状態でのバグ報告はリジェクトされるかもしれません。

とあるので、 ,cpp,lzo の pump 関連のオプションは外すことにした。

distcc 時の MAKEOPTS=“-jN -lM” についてだが、 -lM M の値を増やさないと distcc サーバの負荷が高くならないので、 distcc サーバのコア数程度には高める必要があるかも。 M の値を高めても distcc クライアント側の負荷はそれほど高くならなかった。

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

参考

Set Up Your RPi as a distcc Client

ここをなぞった。 だた若干、 sakaki- さんの運用方法と今の運用をしてくれているGenPi64/gentoo-on-rpi-64bitで package.accept_keywords の扱いが変わっているので修正している。


Profile picture

Written by tin-machine 技術関連のメモ Twitter