分布式编译用于解决编译较大工程时速度慢的问题,充分利用网络上闲置的主机,加快编译时间。
比如Electron,动辄几十个G代码,在本机编译一次需要20几个小时。
distcc是一款符合GPL协议开源的分布式编译协同软件,它分为两个部分:distcc-client和distcc-server。distcc-client将代码的编译请求发送到distcc-server上,而distcc-server则会对代码按要求进行编译后回传至请求方,从而完成编译代码的动作。client可以和server装在同一台电脑上,也即是说一台电脑可以利用其他电脑进行分布编译,也可以在空闲的时候为其他电脑提供分布编译服务。
网上讲解比较多,这里不再做赘述。
icecream也是一款分布式编译工具,其有至少一个调度服务器,多个客户端组成。
如图所示,整个配置中host1做为调度器,同时也运行iceccd程序,在host3上编译代码。整个配置中所有运行iceccd的主机先和调度器host1的8765端口连接,图中蓝色箭头线代表,并打开自己的10245端口。
编译时,由调度器告诉host3哪些主机可以使用,host3和这些主机的10245端口建立tcp链接,图中红色双向箭头线代表,发送编译所需的最小环境。
1.直接下载安装
$ apt-get install icecc
2.源码编译安装
$ git clone https://github.com/icecc/icecream.git
$ apt-get install libarchive-dev libcap-ng-dev libarchive-dev liblzo2-2 liblzo2-dev libzstd-dev\
docbook docbook-utils sciidoc-base docbook-xsl
$ cd icecream
$ ./autogen.sh && ./configure --prefix=/opt/icecream && make &&make install
如果github上不去,可以直接使用下载好的软件包: 点此下载.
本次讲述安装采用apt-get install icecc方式进行安装。
icecc的配置文件在*/etc/icecc/icecc.conf*
调度服务器上不用更改此文件。
客户段上需要更改此文件的最后一行添加上调度服务器的地址ICECC_SCHEDULER_HOST=“your icecc-scheduler ip”(原理上是会自动搜索调度服务器的地址,但是我们使用在docker中,由于地址做了nat,搜索不到,所以需要配置)。
icecc的客户端启动脚本位于*/etc/init.d/iceccd*
icecc的调度服务器脚本位于*/etc/init.d/icecc-scheduler*
注意
可以不用更改便可以启动,但是为了打开icecc的信息log信息,更改两个配置文件中的logfile=" -l $ICECC_SCHEDULER_LOG_FILE" 为logfile="-vvv -l $ICECC_SCHEDULER_LOG_FILE"
调度服务器 systemct start icecc-scheduler
客户端 systemctl start iceccd
注意
调度服务器上也可以开启客户端
在任意一台开启了iceccd的电脑上进入开源代码目录中执行,上执行
$ export ICECC_DEBUG=info
$ make clean;make -j4 CC='icecc gcc'
编译的同时会输出icecc编译信息,详细的log可以使用如下命令查看:
$ tail -f /var/log/iceccd.log
在编译中为了快速部署,将icecc做成docker容器,需要注意的是,启动按如下方式:
$ docker run -tid --name distribute --privileged=true -p 10245:10245/tcp -v /home/workspace/icecc/:/mnt -p 8765:8765/tcp -p 8766:8766/tcp -p 8765:8765/udp dist/debian:v1.0 /sbin/init
将docker中的10245,8765端口映射到本机。
使用icecc和ccache搭配,加速electron编译
1.安装ccache
$ apt-get install ccache
2.配置ccache
$ export set CCACHE_DIR=/mnt/ccache_lns_gcc_dir/
$ export set CCACHE_LOGFILE=/var/log/ccache.log
ccache的默认缓存大小为5G,可以通过如下命令修改
$ ccache -M 16G
3.查看ccache信息
f5499a6697ab:electron-gn# ccache -s
cache directory /mnt/ccache_gcc_dir/
primary config /mnt/ccache_gcc_dir//ccache.conf
secondary config (readonly) /etc/ccache.conf
stats updated Wed Nov 18 03:48:20 2020
cache hit (direct) 15900
cache hit (preprocessed) 96
cache miss 41581
cache hit rate 27.78 %
compile failed 92
couldn't find the compiler 4
unsupported code directive 1
no input file 4
cleanups performed 0
files in cache 132820
cache size 13.3 GB
max cache size 16.0 GB
4.更改electron配置
$ cat build/toolchain/cc_wrapper.gni
#将其中的cc_wrapper改为如下
cc_wrapper = "ccache"
5.使用distcc编译
配置好后,在当前的终端中执行如下命令
$ export CCACHE_PREFIX=icecc
#使用gn,重新生成ninja所需配置文件
$ export CHROMIUM_BUILDTOOLS_PATH=`pwd`/buildtools
$ gn gen out/Testing --args='import("//electron/build/args/testing.gn")';
#调用ninja编译
$ ninja -j 8 -C out/Testing electron
此时可以在其他运行iceccd的机器上使用tail -f /var/log/iceccd.log查看编译输出。