distcc+ccache+dmucs构建分布式编译环境
PS: distcc3.1+之后的pump模式足可以取代dmucs,因此,此文几乎没有什么作用,看看就好 ^_^(20170322)
因公司内部服务器环境发生变化,需进行迁移工作,重新配置开发编译环境。发觉了distcc+ccache这个分布式编译的东东,研究了一阵子,并参考网上资料,加入了dmucs,使得整体编译效率会有所提高,以下为例子演示:
参考链接:
1 2 3 4 5 6 |
http://www.ibm.com/developerworks/cn/linux/l-ccache.html http://manpages.ubuntu.com/manpages/xenial/man1/distcc.1.html https://code.google.com/archive/p/distcc/ http://blog.csdn.net/douhuasinandu/article/details/8640176 http://www.yebangyu.org/blog/2015/11/30/build-distributed-compilation-env/ http://dmucs.sourceforge.net/ |
Distcc的工作原理为:
GCC 编译C/C++构建一个execualble分为四个阶段:
1,cpp(C预处理器):.c 到.i, 由cc完成汇编
2,ccl(C编译器):.i到.s ,由cc完成 由cc完成编译
3,as(汇编器):.s到.o,由as完成
4,链接:.o 到可执行文件,由collect2完成
其中第三阶段是效率瓶颈
因此,distcc此时作为编译器驱动器,负责把gcc -c预处理输出分布到指定的服务器进行处理,
对应的服务器的distccd进程接收到任务,交给本地的distcc进而编译,最终把.o文件返回给客户端
客户端再链接成可执行文件,完成编译过程
Ccache(cache compiler)作用:
ccache(“compiler cache”的缩写)工具会高速缓存编译生成的信息,并在编译的特定部分使用高速缓存的信息,
比如头文件,这样就节省了通常使用 cpp 解析这些信息所需要的时间。如果您编译清单 2 中的文件,
假定 foobar.h 中包含对其他头文件的引用,ccache 会用那个文件的 cpp-parsed 版本来 取代 include 声明。
就那么简单。不是真正去读取、理解并解释其内容,ccache 只是将最终的文本拷贝到文件中,使得它可以立即被编译。
DMUCS(Distributed Multi-User Compilation System):
用于distcc的负载均衡算法过于简单,越靠前的主机得到的任务越多,导致其它机器的工作效率低下
因此,使用DMUCS实现动态平衡和任务分布
开发机: 192.168.122.100
调度器: 192.168.122.101
服务端: 192.168.122.102 192.168.122.103 192.168.122.104
linux系统: Centos6.8 x86_64
软件版本:
distcc-server-3.2rc1-2.el6.x86_64
distcc-3.2rc1-2.el6.x86_64
ccache-3.1.6-2.el6.x86_64
dmucs-0.6.1-2.1.tar.gz
1,开发机部署
ps: 安装distcc-server是因为开发机自身也可以加入编译服务器队列
1 |
yum -y install distcc distcc-server ccache |
下载dmucs源码,编译安装,这个源码是我从debian85上面apt-get得来,dmucs_0.6.1-2.1
因为参考文章中的https://sourceforge.net/projects/dmucs/files/dmucs/dmucs%200.6.1/这个版本存在64位系统兼容bug
ps: 安装dmucs目的是为了得到gethost组件,用来和调度器通信
1 2 3 |
wget http://download.90hsa.com/sources/dmucs_0.6.1-2.1.tar.gz tar xf dmucs_0.6.1-2.1.tar.gz ./configure && make && make install |
配置distcc和ccache
参数说明, distcc3.1+版本加入pump模式,改善之前的算法,强制所有主机都随机化加入工作队列
启用方法: --randomize xxx,cpp,lzo
make的时候用pump make -j8即可启动distcc-pump
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
cat >>~/.bashrc<<EOF #定义distcc可以连接的distccd服务端 export DISTCC_HOSTS="--randomize 192.168.122.105,cpp,lzo 192.168.122.106,cpp,lzo 192.168.122.100,cpp,lzo" export DISTCC_VERBOSE=1 export DISTCC_LOG="/var/log/distcc.log" #export CC=distcc #export CXX="distcc g++" ## ----- Ccache ----- # # export CCACHE_DISABLE=1 CCACHE_DIR=/Data/Cache/CCache CCACHE_LOGFILE=/Data/Cache/CCache.log CCACHE_PREFIX="distcc" CC="ccache gcc" CXX="ccache g++" #DISTCC_BACKOFF_PERIOD=300 export CCACHE_DIR CCACHE_LOGFILE CCACHE_PREFIX CC CXX # ## ----- End ----- EOF |
2,调度器部署
编译安装dmucs即可,省略
配置dmucs,编写主机列表,默认配置文件在/usr/local/etc/dmucs.conf
1 2 3 4 5 6 |
cat >/usr/local/etc/dmucs.conf<<EOF #Format: machine number-of-cpus power-index 192.168.122.102 4 3 192.168.122.103 4 10 192.168.122.104 4 5 EOF |
启动调度器
1 |
dmucs & |
3,服务端distccd部署
1 |
yum -y install distcc distcc-server ccache |
编译安装dmucs,是为了得到loadavg组件,与调度器传递机器负载信息,省略
配置distccd
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
cat >/etc/default/distcc<<EOF # 设distcc是否开机启动 STARTDISTCC=true #是否使用zeroconf通过mDNS/DNS-SD用于发现distcc而不用手动配置主机,建议开启 ZEROCONF=true #可以允许的网络访问,建议在启动的时候 --allow 192.168.0.0/16 #ALLOWEDNETS="127.0.0.110.2.3.0/24" #监听地址 #LISTENER="0.0.0.0" #设置本机最大运行任务数量,要小于等于cpu核心数 #JOBS="12" #设定以上的网络内哪些主机可以连接,不建议定义 #+zeroconf #192.168.12.11 192.168.12.12 EOF service distccd start |
ps: 此时通过ps aux | grep distccd是发现没有进程,是因为启动脚本读取的配置文件为/etc/sysconfig/distccd
因此, 手动启动 distccd --daemon --user nobody --allow 192.168.0.0/16
更多用法解析可以distccd --help
同样配置另外的2台机器
Finally,test!!
去到开发机,找个php源码来编译试试,使用distccmon-text观察效果,附带编译例子,-j18是由所有主机的CPU核心数总和*1.5得来
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 |
#!/bin/bash #export CC=distcc #export CXX="distcc g++" #export CPP="ccache cpp" date +"%F %T" #make -j4 CC=distcc CXX="distcc g++" 1>log 2>error #./configure export CC="gethost --server 192.168.122.101 ccache gcc" \ CXX="gethost --server 192.168.122.101 ccache g++" \ CPP="gethost --server 192.168.122.101 ccache cpp" #pump make -j4 CC="ccache gcc" CXX="ccache g++" CPP="ccache cpp" 1>log 2>error pump make -j18 1>log 2>error date +"%F %T" |
centos下源码编译安装github上最新版本0.6.1编译失败怎么解决呀。。
0.0
啥报错
老司机求带 ^ — ^
| _&_ | : )
绝望的眼神 ^——-=