- 论坛徽章:
- 0
|
Distcc手册页
译者:不开花
目录
*
名字
*
摘要
*
描述
*
快速开始
*
它如何工作
*
选项摘要
*
安装DISTCC
*
伪装
*
和DISTCC一起使用CCACHE
*
HOST说明
*
压缩
*
搜索路径
*
超时设定
*
诊断
*
退出代码
*
文件
*
环境变量
*
交叉编译
*
BUGS
*
作者
*
许可证
*
参考资料
名字
distcc - 分布式C/C++/ObjC编译器。
摘要
distcc <编译器> [编译器选项]
distcc [编译器选项]
<编译器> [编译器选项]
描述
distcc通过网络上的若干台机器分布式编译C代码。 distcc应该和本地编译器产生一样的输出, 易于安装和使用,比本地编译器要快。
对于每个任务,distcc通过网络发送预处理过的源码和编译器参数,这样各个机器间不需要共享文件系统,或是安装有相同的头文件和库,也不需要同步时钟。
编译任务由一个“客户端”机器驱动, 这通常是开发者的工作站或膝上电脑。distcc客户端运行在这个机器上,在其上做make,预处理,连接,和编译过程的其它步骤。一些数目的“志愿者” 帮助客户端通过运行distccd(1)守护程序调用C编译器和汇编程序来编译程序。
distcc可通过TCP套接字(默认在3632端口),或是通过ssh(1)隧道。对于TCP连接,志愿者必须直接或通过inetd运行distccd(1)守护程序。对于SSH连接,必须安装了distccd,但不应侦听连接。
TCP连接仅在安全网络里使用,因为没有用户认证或对源码和目标代码的保护措施。 SSH连接通常要慢25%,因为有用于加密的处理器负载,虽然这主要依赖于处理器,网络和要编译的程序。
distcc和GNU make的 -j 选项一起使用, 这会同时运行若干个编译过程。 distcc通过本地和远程处理器分发任务。 Because distcc is able to distribute most of the work across the network a higher concurrency level can be used than for local builds. -j 值通常设为可用处理器数的两倍, 考虑到一些任务由于等待磁盘或网络IO而闭塞。 distcc也可以和像SCons这样的编译控制工具一起使用。
强烈推荐你在参加编译的所有机器上安装相同版本的编译器。不兼容的编译器可能导致诡异的编译和连接错误。
快速开始
1 对于每个机器,下载distcc,解压,接着安装。
2 在每个服务端上,运行 distccd --daemon ,可选项--allow限定访问。
3 把服务端的名字放到你的环境:
$ export DISTCC_HOSTS='localhost red green blue'
4 编译!
$ make -j8 CC=distcc
它如何工作
distcc总是仅在远程运行编译器和汇编器。预处理必须在本地运行,因为它需要访问本地机器上的各种头文件,这在志愿者机器上可能不存在或是版本不同。与之类似,连接器需要检查库和目标文件,所以必须本地运行。
编译器和汇编器处理单个的输入文件(预处理过的源码)并产生单个的输出(目标文件)。 distcc 通过网络传输这两个文件并且可以远程运行编译器/汇编器。
幸运的是, 对于大多数程序,预处理相对轻松, 连接器调用也不频繁,因此大多数工作可以分布式的。
distcc检查它的命令行来决定调用那个阶段,任务是否可分布式处理。
选项摘要
传递给distcc的选项解释成编译器选项。有两个选项是由distcc自己解释:
--help
显示指令概要。
--version
显示distcc客户端版本。
安装DISTCC
为了适应不同的情况,有三种方法可调用distcc:
为了远程运行和解释对其的调用,distcc可以以真实编译器的名字安装。当你想对所有的编译任务使用distcc时,这个“伪装”的编译器和现存的源码树有最大的兼容性。实际上distcc的使用对于makefile来说是透明的。
distcc可以附加在编译器命令行里,例如"distcc cc -c hello.c"或 CC="distcc gcc"。 如果你仅想对某些编译任务使用distcc或试用,这都是透明的,但是对于一些makefile或是一些版本的libtool假定$CC不包含空格。
最后, distcc可直接以一个编译器使用。 在这个“绝对”模式里,"cc" 总是作为真实编译器的名字使用。 当“清晰”模式不工作时,这对于交互使用是透明的,但是对于新的应用真的不推荐这么做。
记住不要同时使用两种方法调用distcc。如果你在使用伪装目录,不要改变CC和/或CXX, 只要把目录放到你的PATH的前部。如果你没使用伪装目录,你需要或是改变CC和/或CXX,或修改makefile来清楚的调用distcc。
伪装
基本想法是创建一个包含到真实编译器连接的"伪装目录"。这个目录插入到PATH的前部,以使对于编译器的调用经过解释并用distcc来代替。 distcc接着把自己从PATH中移除来寻找真实的编译器。
例如:
# mkdir /usr/lib/distcc/bin
# cd /usr/lib/distcc/bin
# ln -s ../../../bin/distcc gcc
# ln -s ../../../bin/distcc cc
# ln -s ../../../bin/distcc g++
# ln -s ../../../bin/distcc c++
接着,为了使用distcc, 用户只需要把/usr/lib/distcc/bin目录放到PATH的前部,并在DISTCC_HOSTS或文件里设置主机列表。剩下的distcc会自行处理。
注意这个伪装目录必须处在PATH里包含同名真实编译器的目录前, 同时编译器所调用的任何辅助程序(例如ld)也必须在PATH里的位于伪装目录后的目录里,因为distcc以一个包含所有目录和伪装目录协调的PATH值调用真实的编译器。
在伪装模式可能产生"递归错误",这意味着distcc不知何故再次调用自己,而不是真实的编译器。这表明在PATH里有两个伪装目录,可能在不同目录安装两个distcc. 也可能表明你混合了“伪装”和“清楚”模式。
和DISTCC一起使用CCACHE
ccache是个通过缓存编译输出来加速软件编译的程序。 ccache通常在distcc之前调用, 因此可从缓存取回结果。对于makefile也可能需要一些实验来使事情在一起很好的工作。
最可靠的方法是设置
CCACHE_PREFIX="distcc"
这告诉ccache作为真实编译器的封套来运行distcc。 ccache仍然使用真实的编译器来探测编译器升级。
ccache可通过伪装目录或如下设置来运行
CC="ccache gcc"
直到2.2版, ccache不缓存预处理的源码,因此如果从distccd或distcc运行将不会获得缓存。仅在客户端运行且在使用distcc前。
HOST说明
"主机列表"告诉distcc用于编译的机器。distcc依序查看$DISTCC_HOSTS环境变量,用户$DISTCC_DIR/hosts文件,和主机统计文件。如果没发现主机文件, distcc给出一个警告信息,然后在本地编译。
主机列表由空格分开。最简单和最常用的是主机名,例如
localhost red green blue
distcc首先选择列表开头的主机,所以机器应按性能逐渐降低的顺序排列。特别的,当只有一个编译任务可运行时,使用列表里的第一个机器。
localhost在列表里的次序对于获得最佳性能来说是很重要的。因为本地运行过载任务会很慢, localhost通常应该在首位。然而,客户端有足够的周期运行本地任务和distcc客户端是很重要的。如果客户端慢于志愿者,或如果有很多志愿者,那么客户端应放到列表末尾或根本就不放到列表里。一个通用规则是,如果CPU速度小于总共速度的1/5,那么客户端就不要放到列表里。
性能依赖于用于项目的源码和makefile,以及机器和网络速度。实验不同的主机设置列表和-j数目也许可以改进性能。
语法是
DISTCC_HOSTS = HOSTSPEC ...
HOSTSPEC = LOCAL_HOST | SSH_HOST | TCP_HOST | OLDSTYLE_TCP_HOST
LOCAL_HOST = localhost[/LIMIT]
SSH_HOST = [USER]@HOSTID[/LIMIT][:COMMAND][OPTIONS]
TCP_HOST = HOSTID[ ORT][/LIMIT][OPTIONS]
OLDSTYLE_TCP_HOST = HOSTID[/LIMIT][ ORT][OPTIONS]
HOSTID = HOSTNAME | IPV4
OPTIONS = ,OPTION[OPTIONS]
OPTION = lzo
这里有一些语法的例子:
localhost
"localhost"解释为直接执行编译,而不是传给本机的守护程序。如果你确实连接到本机的守护程序用于测试,接着给出机器的IP地址或真实主机名。 (这会变慢)
IPV4
IPv4地址,例如10.0.0.1
HOSTNAME
使用分析器搜寻主机名。
ORT
连接到指定的端口,而不是默认的3632。
@HOSTID
通过SSH连接到主机, 而不是TCP。SSH连接选项可在~/.ssh/config里设置。
USER@
指定用户通过SSH连接到主机。
:COMMAND
通过SSH连接,使用特定的路径来寻找distccd服务端。这通常仅在由于某种原因你不能安装distccd到用于SSH的默认路径的情况下需要。当在SSH模式得到像"distccd: command not found"这样的错误时才需要这么做。
/LIMIT
可添加一个十进制限额到主机说明来限定客户端发送到机器的任务。默认的限定是每个主机4个(对于localhost是两个),对于服务端也许应进一步限定。当服务端有多余两个处理器时,你应增加这个值。
,lzo
对于TCP或SSH主机,允许LZO压缩。
这里是个可能的样板:
localhost/2 @bigman/16:/opt/bin/distccd oldmachine:4200/1
# cartman is down
distant/3,lzo
主机说明里可有注释。 注释以#号开始直到行尾。
如果列表里的主机不可到达,distcc会给出一个警告并忽略那个主机一分钟。
压缩
lzo主机选项指定数据传输使用LZO压缩, 包括预处理的源码,目标代码和错误信息。对于慢于100Mbps的网络,压缩是合算的, 但是结果十分依赖于网络,处理器和源码树。
允许压缩使distcc客户端和服务端使用了更多的CPU时间,减少了网络开销。源码的压缩率通常是4:1,目标文件的是2:1。
使用压缩要求客户端和服务端最低要使用2.9版的distcc。不需要配置服务端:服务端对于压缩请求总是返回压缩的应答。
搜索路径
如果编译器名是绝对路径,会逐字传给服务端并且编译器会从那个目录运行。例如:
distcc /usr/local/bin/gcc-3.1415 -c hello.c
如果编译器名不是绝对路径, 或不全, 就会搜索distccd的PATH。当distcc从一个伪装目录运行时,仅用编译器的基本名。客户端的PATH仅用于运行预处理器,对于服务端的路径没影响。
超时设定
distcc客户端和服务端在通过网络传输数据时都强制超时设定。这用于探测关机和不可到达的主机, 来避免在使用时服务端连不上的情况下阻止编译工作混乱。如果客户端超时,任务会返回到本地。
超时设定现在还不能配置。
诊断
本地或远程的错误信息或警告用于客户端的诊断输出。
当使用详细选项时,distcc可以提供扩展的调试信息。这由客户端上的DISTCC_VERBOSE环境变量和服务端上的--verbose选项控制。对于处理鼓掌,检查客户端和服务端的错误信息。
退出代码
distcc的退出代码通常是编译器的:0表示成功编译,非0表示别的情况。
distcc distinguishes 在"真实"错误例如源码的语法错误和“偶然”错误例如和志愿者之间的网络问题。在偶然错误情况下, distcc将尝试本地编译除非禁止DISTCC_FALLBACK选项。
如果编译器以一个信号退出, distcc返回信号值和128的和。
distcc内部错误导致一个100到127之间的退出代码。特别的
100
一般distcc故障。
105
内存不足。
110
没找到编译器。
111
递归调用distcc。
116
未定义主机并且禁止应急办法。
(别的列在exitcode.h里)
文件
如果$DISTCC_HOSTS未设置, distcc从$DISTCC_DIR/hosts或编译时设置的审计配置文件。 T可从distcc --help输出查看。
distcc在临时目录里创建了一批临时和隐藏文件。
环境变量
distcc的行为有一批环境变量控制。如果主机列表已经存储到某个文件,大多数情况下是不需要做任何设置的。
DISTCC_HOSTS
空格隔开的志愿主机说明。
DISTCC_VERBOSE
如果设为1, distcc产生说明信息到标准错误流或日志文件。这对于调试问题有用。报告音该包括详细输出。
DISTCC_LOG
从distcc本身接收信息,而不是标准错误。
DISTCC_FALLBACK
如果无法分发任务到打算的主机或没找到主机列表,distcc默认本地编译。如果这个变量设为0,那么禁止应急办法并且编译会因此失败。注意这对于总是在本地的任务,例如连接,没有影响。
DISTCC_SAVE_TEMPS
如果设为1, 不删除使用过的临时文件。 对于调试很好,或是你的磁盘很空闲。
DISTCC_TCP_CORK
如果设为0, 禁用"TCP阻塞",甚至它们就在系统里。使用阻塞通常帮助打包请求为更少的包并提升性能。这通常设为允许。
DISTCC_SSH
指定用于打开SSH连接的命令。默认到"ssh"但是也可以设为不同的连接命令,例如 "lsh" 或"tsocks-ssh"等可接收类似命令行的。命令不分开也不由shell执行。
DISTCC_DIR
每个用户用于存储隐藏文件和状态文件的配置目录。默认使用 ~/.distcc/。
TMPDIR
用于预处理源码输出等的临时目录。默认使用/tmp/。
UNCACHED_ERR_FD
如果设定并且也设定了DISTCC_LOG, distcc错误会写到由这个变量定义的文件描述符。这个变量主要由ccache自动使用, 设置它来避免缓存网络问题等的瞬时错误。
交叉编译
交叉编译意味着编译运行在不同处理器,体系结构,或操作系统的机器上的程序。distcc支持交叉编译,包括一组混合架构的机器,尽管编译命令需要做一些改变。
传递到distcc的编译命令必须在每个志愿者机器上正确的运行并产生合适类型的目标文件。如果机器有不同的处理器,那么简单的使用distcc cc就不行了,因为这样通常调用的是志愿者机器本地的编译器。
使用相同处理器但不同操作系统的机器也许不必产生兼容的.o文件。
一些不同的gcc配置可以同时安装到任何机器。如果你从源码编译gcc,你应当使用--program-suffix configuration 选项来使其指定gcc版本和目标平台来安装。
推荐的gcc转换的名字是TARGET-gcc-VERSION 例如i686-linux-gcc-3.2 。 GCC 3.3会以这个名字安装,另外如果是本地编译还可是TARGET-gcc和gcc-VERSION 和gcc。
编译器在客户端和志愿机器上要以同名安装。
BUGS
如果你认为你发现了一个distcc bug,请查看文档目录里的reporting-bugs.txt文件里如何报告bug的信息。
一些丢失或有额外依赖关系的makefile导致出错或减慢并行编译。递归make是无效的并且使处理器不必要的闲置很长时间。 (参阅Peter Miller 的Recursive Make Considered Harmful) Makefile bugs是导致distcc编译失败的最常见原因。make的备选方案,例如SCons,对于某些项目可以产生更快的速度。
使用不同版本的gcc可能导致诡异的编译问题,因为头文件和二进制接口随时间变化了,一些发行包含了不兼容的补丁。 distcc并不处理使用不兼容版本的问题。编译时的连接错误和系统声明的头文件通常是不匹配或安装了不正确的编译器。
由于gcc的限制, 在某些情况下,gdb也许不能使用distcc自动发现用于编译的源文件。可用gdb directory命令。这会在gcc 3.4里修正。
如果源码和目标文件在不同的目录同时没用-MF选项,gcc的-MD 选项可能产生在错误的目录里产生输出。没有完美的解决办法,因为版本的gcc有不兼容的更改。使用-MF 清楚的指出依赖输出文件可修正这个问题。
TCP 连接模式应当仅在可信任的网络里使用。
在志愿主机列表里包含较慢的机器会降低编译速度。
当在NFS上使用distcc或ccache时,必须使用no_subtree_check选项到处文件系统来允许目录间的可靠重命名。
对于编译和连接,可以以gcc hello.c来调用编译器。 distcc并不把它们分割开,而是在本地运行整个任务。
已知别的bugs发表在http://distcc.samba.org/
作者
distcc由Martin Pool <mbp@sourcefrog.net>, 和Wayne Davison, Frerich Raabe, Dimitri Papadopoulos等学者合写,还有一些在作者在NEWS文件里提及。请提交bugs到<distcc@lists.samba.org>。
许可证
你可自由使用distcc。仅在第二版或更晚的GPL下拷贝distcc (包含这个手册),修改或重发布。 distcc不附带任何担保。COPYING文件包含了GPL的副本。
参考资料
distccd(1), ccache(1), gcc(1), make(1) http://distcc.samba.org/ http://ccache.samba.org/ |
|