linux分布式编译
Posted BHY_
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux分布式编译相关的知识,希望对你有一定的参考价值。
1.Distcc 介绍
distcc是一个非常快且免费的分布式C/C++编译工具,安装了distcc后,所有的网络服务器不需要挂载同样一份文件系统,不需要服务器时间同步,也不要求同样的库文件或者头文件,甚至服务器之间可以允许不同的处理器和操作系统。它只要求源代码可以用make-j并行编译,并且参与分布式编译的电脑系统中具有相同的编译器。因为它的原理只是把预处理好的源文件分发到多台计算机上,预处理、编译后的目标文件的链接和其它除编译以外的工作仍然是在发起编译的主控电脑上完成,所以只要求发起编译的那台机器具备一套完整的编译环境就可以了。
2.安装编译
依赖:python
在用户目录下新建文件夹distcc,拷贝distcc-3.2rc1.tar.bz2进去
tar xvf distcc-3.2rc1.tar.bz2 解压
cd distcc-3.2rc1/
./configure --disable-Werror --prefix=/home/$USER/distcc/
make && make install
如果在 ./configure 时,加上了 --with-gnome or --with-gtk 选项,则还可以使用 distccmon-gnome 1 这个图形界面来查看
3.配置
在distcc下新建文件夹compiler,作为伪装目录,把编译器的连接都连接到distcc的二进制文件上,然后把这个目录添加到PATH的前边,这时编译的时候使用的就是distcc编译器,当把目录从PATH去掉后,就改回了原来的编译器。
ln -s ../bin/distcc gcc
ln -s ../bin/distcc g++
在.profile中新增
export PATH=~/distcc/bin:$PATH
export PATH=~/distcc/compiler:$PATH
source .profile
之后which gcc和which g++可以看到都是指向了compiler目录
4.使用
distcc安装好后,包含三个部分:distcc(客户端程序)、distccd(服务端程序)、distccmon-text(监控程序)
distcc:distcc是一个类似客户端的程序,不过它的角色是个编译器,可以让C/C++代码在很多网络服务器上进行分布式的编译,就像本地编译一 样,当然比本地编译快很多。
distccd:distccd是一个守护进程,每个网络服务器上都需要安装这个守护进程,用来处理distcc发送过来的各种计算资源。
distccmon-text:distccmon-text是一个监控程序,用来监控编译的分布情况以及网络服务器编译使用情况。
4.1启动distccd服务(参与编译的工作机都需启动该服务)
distccd –daemon –allow xxx.xxx.xxx.xxx –j8
通过--allow选项指定网关的访问权限,-j指定最大的编译任务数,如果不加--user nobody则会提示:Warning: no such user as "distcc"
netstat -ntlp #查看是否启动成功,3632端口应该被distccd占用
killall distccd #可以关闭所有的distccd
4.2两种编译模式(本机设置)
通用设置
export DISTCC_HOSTS="localhost host2 host3" #设定服务器IP (多个host之间空格分隔),ip应按各服务器性能由好到差排列。
#或者编辑distcc安装目录下的hosts文件
vim ~/distcc/etc/distcc/hosts
内容:xxx.xxx.xxx.xxx/40 xxx.xxx.xxx.xxx/10 localhost/2 --localslots_cpp=70
斜杠后面的数字表示可分配的最大的编译任务数
#添加hosts后,请使用如下指令查看hosts是否指定成功。
distcc --show-hosts
export DISTCC_VERBOSE=1 #给出调试信息
export DISTCC_LOG="~/distcc/distcc.log" #这是记录distcc的编译日志,出错了可以在这里找的。可能权限不足,不能创建日志,建议更换目录
普通模式(预处理在本机完成)
make –jxxx
pump模式(预处理也分布式处理,通常参与机器规模较大,本机性能不是特别好时这种模式分布式效果更好):
要将主机配置为pump模式,请在主机定义中添加,cpp,lzo后缀。Pump模式需要cpp 和 lzo标志(无论文件是C还是C++)
export DISTCC_HOSTS="host1,cpp,lzo host2,cpp,lzo host3,cpp,lzo"
pump make –jxxx
4.3状态查看
启动编译后,可在本机另起一个终端,查看远程机器参与编译的情况。
distccmon-text 1 #每秒更新一次
5 工作机
Linux编译环境有限,如果能将windows作为工作机来分担编译,效果会比较好,安装cygwin,在里面安装gcc编译器
问题:
--localslots主机指定不能远程运行可同时在本地机器上运行多少个工作岗位,而--localslots_cpp 控制有多少预处理器将在本地机器上并行运行。调整这些值可以提高性能。
设置--localslots不生效,在本地永远只有4个ld进程,导致链接过程速度比较慢
查阅了网上的资料,也有一些用户反馈同样的问题,反馈是distcc代码bug。网上暂时无解。看了下代码,直接修改lock.c里的默认值,重新编译。
localhost/2 --localslots=2 --localslots_cpp=2 192.168.0.5/9
- Use localhost, with two jobs being sent to it (this is what the /2 means).
- --localslots=2 means that two jobs can't be sent out to the clients and must run locally.
- --localslots_cpp=2 specifies how many pre-processes will run in parallel.
- 192.168.0.5/9 targets a client, and it's able to take up to 9 jobs.
以上是关于linux分布式编译的主要内容,如果未能解决你的问题,请参考以下文章