Linux下使用distcc搭建分布式编译环境

前几天,老大让我搭建下那边服务器的分布式编译环境,说以前服务端都是单机编译,每次半小时,很浪费时间~~

于是乎,我便去查资料~~~决定使用distcc进行linux下的分布式编译环境的搭建~~~

第一次~~搭建好了~~并且配合ibm官网说的ccache~~~但是效果没怎么体现出来,因为我们的编译客户机只有一台,每次cvs下来都是在那台机器上,

所以我就提倡用多台服务器互联,各自做服务器并且各自做客户机的方式,这样就不需要ccache了,而且即使用了ccache,他们每次编译的时候都要清除上次编译结果,

因为要保证新内容和旧内容之间不会有冲突~~

ccache的搭配我这就不阐述了~~

主要是第一次搭建时,出了问题,因为我没接触过linux下的编译,所以有些不太懂~~花了我1天时间,我才找到问题所在~~

这种大工程,每次编译时都要clean~~~而分布式编译~~在make后需要加上-jN(N是hosts的cpu的个数乘以2)~问题就在这个clean和-j参数上了~~

本来~在单机时~他们是把clean和all写到了一起~~

如:make -f xxx.mak  clean all

现在,我搭建了分布式环境~改成

make -j16 -f xxx.mak clean all

这个-j就是每次make的并行数量~~这样的话~~每次一执行~~有的clean在其它机子上运行尾部,有的在前面~这样就会出现别的机子编译好了~其它机子又clean掉了~

导致最后的链接过程失败~~~

所以~~我改成了make -f xxx.mak clean && make -j16 -f xxx.mak all

这样,每次先在本机上进行clean~然后在分布到其它机子进行编译和链接~~

用这种方式~~到现在仍然没有问题的出现~~ 

找这个问题我是把他们的server编译了不下60遍~~~而且我这个用惯windows调试的人去用gdb一个一个命令的调试~~那种痛苦~~

--------------------------------------搞怪的分割线----------------------------------------------------------------------

好了~~说了问题所在~~现在说下distcc的搭建过程~~

首先是安装~~

下了包~~记住~~后面操作要在root下哦~~

#tar -xvf distccXXX.tar.bz2

#./configure

#make && make install~~

OK。。。安装完毕~!~

现在就是配置过程~~

先找到distcc程序的目录~~

然后建立一个目录,如

#mkdir -p /usr/lib/distcc/bin

#cd /usr/lib/distcc/bin

#ln -s /usr/local/bin/distcc gcc

#ln -s /usr/local/bin/distcc g++

#ln -s /usr/local/bin/distcc cc

#ln -s /usr/local/bin/distcc c++

我的distcc安装目录是local哦~~具体安装目录在安装distcc时可以在./configure下进行配置PREFIX~~~

这个/usr/lib/distcc/bin是要加入到PATH里的哦~~

#vim ~/.bash_profile

在原来的PATH后面加上/usr/lib/distcc/bin

好了~~现在把distcc和编译器链接完成~~下面进行distcc一些初始化的配置

vim ~/.bashrc

加入一段

## ----- Distcc -----
DISTCC_HOSTS="localhost A B C....."//A,B,C代表的是编译的服务器哦,localhost就是把本机也加入到编译阵列中~
DISTCC_VERBOSE=1
DISTCC_LOG="/var/log/distcc.log"//这是记录distcc的编译日志哦,出错了可以在这里找的,目录可以自己换~~
export DISTCC_HOSTS PATH DISTCC_VERBOSE DISTCC_LOG
## ----- End -----
~

distcc要运行,需要运行一个守护进程~~distccd~

所以~~大家在系统的启动项里加上distccd --daemon --allow 10.0.0.0/16(表示允许10.0所有网段链接)

好了~~现在类似的配置到每台服务器~~

每台机器启动时都要运行distccd --daemon --allow 10.0.0.0/16~

 

好了。。现在差不多都已经配置完成了~~重启~~

现在~~每次进行编译的时候,如果是automake的管理,每次编译时~~

#distcc ./configure ....

这样会把distcc写到makefile里的编译器那~~

如果是自己的makefile~~只需把makefile里的编译器改成distcc gcc或者distcc g++~~

要么就是 make -f xxx.mak CC="distcc gcc" CXX="distcc g++"~

不过后者我实验了几次,总是会报错~~建议用前者~~

如果要监视编译情况

watch distccmon-text 或者 distccnom-text N(N为刷屏频率,秒为单位),这个是console下的哦~~

图形界面的监视是distccmon-gnome~~不过貌似要另行安装~

 

到此~~就差不多搭建完成了~~刚开始我搭建觉得很复杂~~其实也就是那么回事~~

不过中途也遇到过很多问题~~总结来,主要问题出现在

(1) IP地址不可达。
(2) distccd进程没有启动。
(3) distcc客户端IP不在--allow指定的范围内。
(4) distccd监听的3632端口被防火墙屏蔽。
distccd的日志记录在/var/log/messages,非常重要~~~

 

----------------------------------邪恶的分割线------------------------------

Ps:

防火墙最好不要开~~如果必要~~不要把3632端口屏蔽~~

distccd一定要记得启动哦~

到现在,我学会了查看日志是多么重要的一件事情~~

Ok,就写到这,还要上班也。。。困~~

 

 

 

原文链接: https://www.cnblogs.com/zjj9850/archive/2010/09/13/1824994.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Linux下使用distcc搭建分布式编译环境

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/14944

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月7日 下午2:47
下一篇 2023年2月7日 下午2:49

相关推荐