之前配置distcc没有考虑负载均衡这一项,现在考虑使用dmucs实现distcc的负载均衡
官方手册
使用官方手册编译会报错,等解决问题后再来总结
=================================================================================
update by 2013-11-08
使用apt安装dmucs
apt-get install dmucs
安装文件:
/. /usr /usr/bin /usr/bin/gethost /usr/bin/loadavg /usr/bin/monitor /usr/bin/remhost /usr/bin/addhost /usr/sbin /usr/sbin/dmucs /usr/sbin/loadavg /usr/share /usr/share/doc /usr/share/doc/dmucs /usr/share/doc/dmucs/copyright /usr/share/doc/dmucs/changelog.Debian.gz /etc /etc/default /etc/default/dmucs /etc/init.d /etc/init.d/dmucs /etc/dmucs.conf
其中用的到的gethost, loadavg, dmucs , 配置文件/etc/default/dmucs && /etc/dmucs.conf
部署结构:
一台机器上启动dmucs进程(host-server),相当于整个体系的大脑,进行后续的任务分配,它可以安装在任意一台机器上,不参与实际的编译过程;
在参与distcc编译的机器上启动loadavg进程,向启动dmucs进程的机器发送本机负载情况;
将要编译的软件包放在安装了distcc和dmucs的某一台机器上,进行编译;
实际的配置:
前提,distcc能够正常运行,能进行分布式编译
dmucs (host-server)的配置:
- 修改/etc/default/dmucs文件,将SERVER=no改为SERVER=yes
- 修改/etc/dmucs.conf文件,其中添加实际参与编译的机器信息,具体格式为:
# Configuration file for dmucs server.
#
# Format: machine number-of-cpus power-indexInnerServer1 2 2
InnerServer2 4 3
InnerServer3 4 3其中第一列为主机地址(或者主机名),第二列为主机拥有的CPU核数(?),第三列为主机性能的权重,最差的机器赋值最小(大于等于1的某个整数),然后性能好的机器赋予更高的权值。
- 启动dmucs,可以以服务方式启动:/etc/init.d/dmucs start , 或者可以直接在命令行输入dumcs,如果在实际参与编译的机器上启动了loadavg,则会看到类似下面的输出:
root@InnerServer1:/home# dmucs
New host available: InnerServer3/4, tier 3, type
New host available: InnerServer1/2, tier 2, type
New host available: InnerServer2/4, tier 3, type
实际参与编译的机器的配置:
- 修改/etc/default/dmucs文件,将USE_SERVER=修改为USE_SERVER=<ip>,ip为(host-server)的地址;
- 启动distcc服务,启动loadavg进程,命令:loadavg -s <ip> -D & , 其中-s 后面指定使用的server,-D代表debug, & 代表后台运行
编译包所在服务器上的配置:
除了按照上面要启动distcc和loadavg,还要做如下配置:
- export DISTCC_HOSTS="<ip1> <ip2> <ip3>...",输出参与实际编译的服务器的地址(这属于distcc 的配置)
- export PATH=/usr/lib/distcc:$APTH,这一步的作用是使用distcc代替gcc,g++等等,因为使用apt-get安装的distcc默认生成目录/usr/lib/distcc,在该目录里面有包括cc/c++/g++/gcc等软链接文件,这些文件全部指向/usr/bin/distcc,也就是说,现在的编译环境全部由distcc提供,因为/usr/lib/distcc目录的文件最先被找到,这一句话可以放在.bashrc文件中,它的作用也等同于其他文档中所说的CC=“distcc gcc” CXX='distcc g++'这一句
- 在configure时执行CC='gethost -s <ip> distcc' CXX='gethost -s <ip> distcc' ./configure,这样在下面make的时候,会先到<ip>所指的server去查询各个机器的性能,然后由该dmucs server统一分配编译任务。注:在其他文档中都没有提到gethost -s <ip>,因为其他以源码包安装的dmucs在安装的时候指定了server,但我是用apt安装,所以在这儿被阻拦了一段时间。 其他文档有按照apt安装的,它所中给出的make -j8 CC=gethost distcc,这条命令肯定无法执行。
- make -j$(distcc -j),如果只用make的话,会看到只有单线程运行,违背了分布式编译的初衷
- 一些工具:distccmon-text 2,显示任务分配,2代表每隔2秒刷新一次,或者watch distccmon-text具有相同的作用。
一些参考:
http://www.ibm.com/developerworks/cn/aix/library/0905_yangyi_distcc/