なんとなく

誰得感満載な記事が多いかも。Mono関係とLinuxのサーバ関係、レビューとか。

Raspberry Pi 3つで分散コンパイル

はじめに

Raspberry Piが3台になったので、分散コンパイル出来る環境にしてみた。

当初1台を購入し、気象観測ボードをつけていたのだけれども、DLNAサーバにもしたいし、いろいろお遊び用にも欲しいと思った。

Raspberry Pi Type B 512MB

待ち時間とか送料とか面倒だったので、Amazonで2台追加で購入した。

3台になったし、環境は同じなので分散コンパイルできるようにしておけば、コンパイル時に1台で行うよりちょっと早くなるだろうという考えで、分散コンパイル環境を設定してみた。

環境

Raspberry Piが3台あり、それぞれにRasbianがインストールしてある。

構成は

ホスト 用途
pi(192.168.11.6) 気象観測ボードがついて、Cactiが動いている気象サーバ
pi2(192.168.11.7) USBの2TBのHDDがついていて、sambaとminidlnaが動いている音楽サーバ
pi3(192.168.11.8) 今のところThin Client用として位置づけているいろいろ試してみるもの

distccで分散コンパイルを実現してみた。

インストール

distccとgccなどの開発環境のインストール

$ sudo apt-get install distcc build-essential

サーバ側の設定の変更

初期設定を自分の環境の設定に変える必要がある。
3台それぞれのサーバで同様の設定をする必要がある。

$ sudo vi /etc/default/distcc

以下の項目について変更した。参考にされる方は各自の環境に合わせてほしい。

起動するように

STARTDISTCC="true"

家庭内のネットワークからのみ許可

ALLOWEDNETS="192.168.11.0/24"

どこからでもListen可

LISTENER="0.0.0.0"

おそらく

LISTENER=""

でもいいはず。

Avahi Zeroconf DNS Service Discovery (DNS-SD)は使用していないので

ZEROCONF="false"

デーモンの起動

$ sudo /etc/init.d/distcc start

念のため初期起動するようにデーモンの設定

$ sudo update-rc.d distcc enable

クライアント側の設定

使用するときは、使用するサーバを環境変数に設定して上げる必要がある
以下はpi3(192.168.11.8)で優先順位としては、pi3,pi2,piの順での例

$ export DISTCC_HOSTS="localhost 192.168.11.7 192.168.11.6"
$ vi ~/.distcc/hosts
localhost 192.168.11.7 192.168.11.6

と書き込んで設定してしまってもいいかもしれない。都度、分散させるサーバを変更したい場合は、環境変数に設定するほうがいいと思う。

確認

適当なソースを見つけ、makeしてみる。
cmakeやconfigureなどで、Makefileを作成するときにCC=distccを入れてあげないとdistccをコンパイラとせず、gccを指定してしまうものもある。

CC=distcc ./configure
CC=distcc cmake -DCMAKE_BUILD_TYPE=Debug
make

jobのオプションでCPUのコア数を分散させて実行させるジョブとなるべく合わせるようにする。多くしたとしても早くなるわけではないようだ。
例)1コアのものが3台

CC=distcc make -j3
コンパイル状況の確認

状況については、以下のコマンドで確認できる

$ distccmon 1 

1は1秒間隔 N秒間隔での監視ができる。

ちなみに3台でコンパイルしたときは、以下のようになっていた

takeshich@pi3 ~ $ distccmon-text 1
17536 Connect base64.c 192.168.11.7[0]
17535 Compile file.c localhost[0]

17535 Compile file.c localhost[0]
17536 Preprocess localhost[1]
17546 Preprocess localhost[2]

17546 Compile timeval.c 192.168.11.6[0]
17535 Compile file.c localhost[0]
17536 Preprocess localhost[1]

17546 Compile timeval.c 192.168.11.6[0]
17536 Compile base64.c 192.168.11.7[0]
17535 Compile file.c localhost[0]

17546 Compile timeval.c 192.168.11.6[0]
17536 Compile base64.c 192.168.11.7[0]
17535 Compile file.c localhost[0]

念のため、
localhost以外の対象のホストにsshなどでログインし、topコマンドでコンパイルが実行されているか確認する。

計測

curl(http://curl.haxx.se/download/curl-7.33.0.tar.gz)をコンパイルして計測してみた

CC=distcc ./configure
time CC=distcc make -j3
台数 make -j3 make -j6
1台(pi3) 17m33.659s 17m35.086s
2台(pi3,pi2) 12m23.681s 10m23.239s
3台(pi3,pi2,pi) 10m9.780s 9m36.061s

3台中1台(pi)は、負荷の高い処理をしているので、こんな感じか。
確かに1台の時に比べると分散しているから速くなる。
jobのオプションは偶数の方がよさそうだな。

ちなみにDTIのVPSだと

make -j3
0m28.266s

お、おう。気にしないw
ロスコンパイル環境作って、VPSで実行したほうが速いな。。。たぶん。

最後に

そもそも、あんまりRaspberry Pi実機でビルドすることって無いかもしれない。
また、誰得なことをやってしまったが、分散コンパイルについて勉強になった。