Linux下分布式编译工具distcc源码研究
distcc是Linux环境下的著名的开源分布式编译工具,最近决心研究一下其实现。
首先用svn下载其源码,命令为:
# Non-members may check out a read-onlyworking copy anonymously over HTTP.
svn checkout http://distcc.googlecode.com/svn/trunk/distcc-read-only
首先找到其main函数。找了一会,找到了,在distcc.c。大致看了下main函数的作用是:检查输入参数,然后调用dcc_build_somewhere()函数。build_somewhere这个函数名有意思——在你不知道的某处进行编译。
为了便于研究distcc,需要学习一些分布式编译原理以及distcc的简单用法。
分布式编译的原理很简单, 就是将编译的整个工作量通过分布计算的方法分配到多个计算机上执行, 这样可以获得极大的效率提升. 由于分布式计算的技术相对成熟, 现在可以见到的分布式编译软件也较多. 一般来说, 一个分布式编译软件不是一个编译器, 而是附着在某个编译器上的分布计算管理软件, 使得对于特定的编译器可以实现分布式编译。
IncrediBuild想必大家都经常使用吧?IncrediBuild需要一个特定的计算机做仲裁者, 其他的所有计算机作为客户, 有了仲裁者的好处是, 可以有它来统一安排所有客户端所发起的编译请求, 一旦某个客户发起编译请求, 则仲裁者会根据其他客户的CPU空闲情况而安排分布式编译, 当多个客户同时发起编译请求时, 仲裁者会自动平衡分布计算负担,使得编译参与者不会占用过多的CPU。distcc和IncrediBuild的差别在与distcc不使用仲裁者, 直接由客户端对其他客户端发起编译请求. 所以每个客户端都需要知道其他客户端的位置, 并且当多个客户发起编译请求时不易做平衡处理。
下面是关于distcc快速安装和配置的说明:
下载 distcc(请参阅 参考资料 部分)。
通过执行 ./configure; make &&make install 在所有机器上编译distcc 源。
编译过程先在某台机器上开始,然后分布所有其他机器(服务器)。在所有服务器中,启动 distccd 守护程序(您必须具有执行操作的根特权)。distccd 位于 /etc/init.d 文件夹。在根模式下启动 distccd 的语法是
tcsh-arpan# /etc/init.d/distccd start
在用户模式下启动它的语法是
tcsh-arpan$ sudo /etc/init.d/distccd
还可以通过运行 distccd –daemon –j N 在用户模式下运行distcc 守护进程,其中 N 是您要在给定机器上运行的作业数。
本地机器需要知道应该将编译过程分布到哪些服务器。根据您的 shell,发出与下面命令相似的命令:
export DISTCC_HOSTS='localhost tintin asterix pogo'
tintin、asterix 和 pogo 是网络中可以驻留编译过程的其他主机;localhost 是本地计算机。
也可以不使用导出指令。您可以创建一个名为 hosts 的文件,将服务器的名称放在该文件中,各个名称使用空格分隔。将该文件复制到$HOME/.distcc 文件夹。
distcc 的工作原理
distcc 将预处理代码发送给网络中的其他指定机器。distccd 守护进程确保编译在远程机器上发生。distcc 的设计目的是与 GNU make 的并行编译(-j)选项一起使用。distcc本身不是一个编译器;它只是用作 g++ 的一个前端。几乎 g++ 的所有选项都可以按原样传递给 distcc。
安装 distcc 之后,惟一需要做的就是触发编译。下面是调用方法:
make –j4 CC=distcc –f makefile.x86_linux
以上的信息来自我的搜索。这里稍微解释下,linux的守护进程大致相当于windows下的服务进程。看到这里我产生一个疑问是:看样子distccd 守护程序大致相当于分布式编译工具中的服务器端,那么它起的作用是什么?我猜测它应该起一个捕捉消息、传递消息和远程调用的作用,具体是:
这个猜测还有待验证。开始还不知道服务器端程序的入口函数在哪里,找了一下,服务器端(即distccd 守护进程)的main函数在daemon.c。