Icecream

十分に並列ビルド(make -jNなど)ができる環境にて、「横にあるCPUが遊んでるパソコンもコンパイルに使えればいいのに」と思うことはよくあるはず。そういうのを分散コンパイル(Ditributed Compile)といい、その手の歴史が長くて知名度が高いメジャーなやつとしてdistccがある。

ただdistccにも弱点があって、マスターとスレーブでgccバージョンが違ったら吐かれるコードが変わっちゃうよとか、マスターでスレイブのIPアドレス一覧を管理しないといけないよとか、マスターから見てどのスレーブが暇なのかわからんとか、などなど。それらを解決できるやつとしてIcecreamというのが最近ホットみたい。Ubuntu 14.04 LTSだと apt にも入っていて簡単に試せる。<

# apt-get install icecc icecc-monitor
# /etc/init.d/icecc-scheduler start (icecc-scheduler はネットワーク上で1つだけ実行する)
# vi/etc/icecc/icecc.conf
ICECC_SCHEDULER_HOST="192.168.1.111" (マニュアルに寄ればブロードキャストで探すらしいけどダメだったので手動で指定)
# /etc/init.d/iceccd start
分散コンパイルに参加させたいマシンそれぞれにて iceccd を起動すればよい。マシンをたくさん用意できるなら ICECC_MAX_JOBS も適切に設定した方がいいかもしれない。

これで準備完了。マスター(コンパイルのジョブを作る人)からは、
$ export PATH=/usr/lib/icecc/bin:$PATH
として普通にビルドで。 /usr/lib/icecc/bin には cc c++ gcc g++ の名前で /usr/bin/icecc への symlink になってる。ccacheと同じようにwrapperとして動かせばよい。icemonを使えば分散ビルドしている様子がGUIで見て取れる。

Icecreamにはコンパイラのツールをマスターからスレーブに送りつける機能がある。たいていはクロスコンパイル目的かと。
$ mkdir ~/icecream
$ cd icecream
$ icecc --build-native --gcc /usr/local/aarch64-linux/bin/aarch64-linux-gcc /usr/local/aarch64-linux/bin/aarch64-linux-g++
$ mv ****************.tgz aarch64-linux.tgz
とパッケージをあらかじめ作っておいて
# cd /usr/lib/icecc/bin
# ln -s /usr/bin/icecc aarch64-linux-gcc
# ln -s /usr/bin/icecc aarch64-linux-g++
でwrapperとして動くようにsymlink作っておき、
$ export ICECC_VERSION=~/icecream/aarch64-linux.tgz
としてから普通にビルドで。スレーブにaarch64-linux-gccがインストールされていなくてもOKとなる。

ICECC_VERSIONはマルチホスト・マルチターゲット対応となっている。マニュアルから参照すると仕様としては、
「<native_filename>(,<platform>:<cross_compiler_filename>=<target>)*」
具体的には、
ICECC_VERSION=/work/9.1-i386.tar.bz2,ia64:/work/9.1-cross-ia64.tar.bz2,Darwin_PowerPCMac:/work/osx-generate-i386.tar.gz
とか
ICECC_VERSION=/work/i386-native.tar.gz,/work/arm-eabi-toolchain1.tar.gz=arm-eabi,/work/arm-linux-androideabi-toolchain2.tar.gz=arm-linux-androideabi
とか。ツールのパッケージはそれぞれに用意する。ただしマルチターゲット機能は v1.0.1 では対応してなくて v1.1 からの対応となる...けどv1.1の正式版がなかなかでてないようなのよねぇ。。なので、マルチターゲット機能を使いたい人は自分で Github からコード落としてきてコンパイルして使おう。

最後におおざっぱに使ってみた感触を。理想的に並列ビルドができる環境だと、3台でIcecream使ってビルドすると、1台で普通にビルドするのと比べて、おおむね半分の時間でビルドできる。逆に、シングルでビルドするとオーバヘッドがおおむね2から3割かかる。gccとかllvmとかlinuxとかglibcとかchromiumとかqtとか、そういう大物だけねらい打ちで使った方が効果がある気がする。

このブログ記事について

このページは、らるるが2016年9月 5日 02:20に書いたブログ記事です。

ひとつ前のブログ記事は「Linuxでlazy umountしたときに厳密にumountされたタイミングを知る方法」です。

次のブログ記事は「Yoctoビルドでパッチ当てる方法」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

月別 アーカイブ

ウェブページ

Powered by Movable Type 7.9.0