Yebangyu's Blog

Fond of Concurrency Programming , Distributed System and Machine Learning

利用Distcc和Dmucs构建大规模、分布式C++编译环境(上)

如果您的C++项目非常庞大,含有1000.h文件,2000.cpp文件,那么我敢打赌,每次编译所花的时间,都足够您喝3000杯咖啡了。如何加快编译速度?

Distcc是开源的用于搭建分布式编译环境的利器,它通过利用多台机器的资源,并行编译,来解决这个棘手的问题。然而,它的调度算法过于简单,不大合理,因此我们利用DMUCS提供的调度功能,来搭建一个相对完美的分布式编译平台。本文,我们首先介绍如何(单独)使用Distcc来加速编译,下一篇介绍如何组合使用Distcc+DMUCS来做进一步的完善和优化。

话不多说,我们的编译平台包括:

开发机(Client):这一台机器上有我们的项目、工程文件、代码,平时我们在这台机器上写代码,要编译的对象也在这台机器上。机器IP192.168.1.99

服务器(Server):负责编译的机器,一共有3台。IP分别为192.168.1.11,192.168.1.22,192.168.1.33.

调度器(Scheduler):调度程序所在的机器,负责把编译任务合理的派发到编译机器(服务器)的编译程序上。IP192.168.1.88。这台机器的部署和配置,我们留到下一篇博文介绍。

以上所有机器都是安装的Ubuntu 14.04操作系统。

服务器

1,安装gcc

sudo apt-get install gcc

2,安装Distcc

sudo apt-get install distcc

安装后可以得到两个二进制文件,distccddistcc。前者主要负责网络数据处理,后者可以认为是g++的前端,调用g++进行编译。

3,配置Distcc

打开/etc/default/distcc,设置如下配置项:

STARTDISTCC="true"  
ALLOWEDNETS="127.0.0.1 192.168.1.0/24"
LISTENER="0.0.0.0"

第一行设置开机就启动distccd

第二行设置允许利用本机进行编译的开发机

第三行设置监听的网络

4,启动distccd

sudo service distcc start

经过以上配置,每次机器开机,都会自动运行distccd

运行如下命令确认下:

ps -aux | grep distccd

如果看到类似的输出,说明一切OK了。

distccd   3457  0.0  0.0   3260   144 ?        SNs  23:33   0:00 /usr/bin/distccd --pid-file=/var/run/distccd.pid --log-file=/var/log/distccd.log --daemon --allow 127.0.0.1 --listen 0.0.0.0 --nice 10
distccd   3458  0.0  0.0   3260   144 ?        SN   23:33   0:00 /usr/bin/distccd --pid-file=/var/run/distccd.pid --log-file=/var/log/distccd.log --daemon --allow 127.0.0.1 --listen 0.0.0.0 --nice 10
distccd   3461  0.0  0.0   3260   144 ?        SN   23:33   0:00 /usr/bin/distccd --pid-file=/var/run/distccd.pid --log-file=/var/log/distccd.log --daemon --allow 127.0.0.1 --listen 0.0.0.0 --nice 10

开发机

1,安装Distcc

当然啦,我们假设您的开发机上已经安装gcc了。

2,设置编译资源

这一步是指定哪些机器(也就是上面的Server)来负责编译工作。

export DISTCC_HOSTS="192.168.1.11 192.168.1.22 192.168.1.33"

每台机器的IP之间用空格隔开。

如果机器很多,那么这样填写可能不大方便,可以在/etc/distcc/hosts里添加。

这两种方法可以任选一种,如果您两种都用,那么Distcc只认DISTCC_HOSTS值。

3,应用Distcc

应用Distcc来编译代码有几种方法:

方法一:修改makefile中的CXX的值

makefile文件中的这一行

CXX = g++ 

改为

CXX = distcc g++

然后运行make -j18即可。这里的18,为所有服务器的CPU Cores的数量乘以1.5。上面有3台服务器,每台有4核,因此这里设置为18

为了获得最优值,很可能需要反复实验、测试。

方法二:修改configure文件

如果您的makefile文件由automake产生,那么在运行./configure时得加上参数,变为:

./configure --CXX=distcc g++

那么生成的makefile文件将自动使用Distcc了。

如果不出意外,编译速度已经大大提升了。然而,还有提高的空间,欲知详情,请看下篇分解。