dmucs与distcc

时间:2021-11-16 13:12:21

之前配置distcc没有考虑负载均衡这一项,现在考虑使用dmucs实现distcc的负载均衡

官方手册

http://dmucs.sourceforge.net/

使用官方手册编译会报错,等解决问题后再来总结

=================================================================================

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-index

    InnerServer1 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/

http://dmucs.sourceforge.net/

http://blog.chinaunix.net/uid-28190171-id-3379699.html