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 は不要。ただし
- gcc のプロファイルを揃える
- distcc サーバーの IP アドレスの追加 は必要。
gcc のプロファイルを確認
gcc-config --list-profilesdistcc サーバーとずれている場合は
gcc-config 1などでプロファイルを選択する( gcc-config の結果によっては数字が異なる場合もある )
/etc/distcc/hosts に distcc サーバーの IP アドレスを追加。
/etc/portage/make.conf の FEATURES に distcc を追加。
distcc を emerge する場合
GenPi64 は最初から distcc がインストール済みなので不要だが、自分でコンパイルする場合は下記の手順になる。
vi /etc/portage/make.conf2021/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-profilesgcc-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 の扱いが変わっているので修正している。