はじめに
Raspberry Piが3台になったので、分散コンパイル出来る環境にしてみた。
当初1台を購入し、気象観測ボードをつけていたのだけれども、DLNAサーバにもしたいし、いろいろお遊び用にも欲しいと思った。
待ち時間とか送料とか面倒だったので、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で分散コンパイルを実現してみた。
サーバ側の設定の変更
初期設定を自分の環境の設定に変える必要がある。
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実機でビルドすることって無いかもしれない。
また、誰得なことをやってしまったが、分散コンパイルについて勉強になった。