英语法语西班牙语

Ad


OnWorks 网站图标

distcc - 云端在线

通过 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器在 OnWorks 免费托管服务提供商中运行 distcc

这是命令 distcc,可以使用我们的多个免费在线工作站之一在 OnWorks 免费托管服务提供商中运行,例如 Ubuntu Online、Fedora Online、Windows 在线模拟器或 MAC OS 在线模拟器

程序:

您的姓名


distcc - 带有 distcc-pump 扩展的分布式 C/C++/ObjC 编译器

概要


分区 [编译器 选项]

分区 [编译器 选项]

[编译器 选项]

分区 [DISTCC 选项]

商品描述


distcc 在网络上的多台机器上分发 C 代码的编译。 分区
应该始终生成与本地编译相同的结果,安装和
使用,它通常比本地编译快得多。

此版本包含普通的 distcc 以及称为泵模式的增强功能或
distcc-泵。

对于每个作业,纯模式的 distcc 发送完整的预处理源代码和
通过网络从客户端到编译服务器的编译器参数。 泵内
模式,distcc 发送源代码和递归包含的头文件(不包括那些
来自默认的系统头目录),以便预处理和编译
可以在编译服务器上进行。 这加快了编译的交付
比普通的 distcc 高一个数量级。

编译由客户端机器驱动,通常是开发人员的工作站
或笔记本电脑。 distcc 客户端在这台机器上运行,就像 make 一样,预处理器(如果
不使用 distcc 的泵模式)、链接器和构建过程的其他阶段。 任何
一些志愿者机器充当编译服务器并帮助客户构建
程序,通过运行 光盘(1) 守护进程、C 编译器和汇编器。

distcc 可以通过 TCP 套接字(默认在端口 3632)或通过隧道运行
命令如 SSH(1). 对于 TCP 连接,志愿者必须运行 光盘(1) 守护进程
直接或来自inetd。 对于 SSH 连接,必须安装 distccd 但应该
不能 正在侦听连接。

TCP 连接应该只在安全网络上使用,因为没有用户
源代码或目标代码的验证或保护。 SSH 连接通常为 25%
由于加密的处理器开销而变慢,尽管这可能会有很大差异
取决于 CPU、网络和正在构建的程序。

distcc 旨在与 GNU Make 一起使用 -j 选项,运行多个编译器
同时处理。 distcc 将作业分布在本地和远程 CPU 上。
由于 distcc 能够在网络上分发大部分工作,因此更高的
可以使用并发级别而不是本地构建。 根据经验, -j 折扣值
应设置为可用服务器 CPU 总数的两倍左右,但受制于
客户端限制。 此设置允许最大程度地交错被阻止的任务
等待磁盘或网络 IO。 请注意,distcc 也可以与其他构建控件一起使用
工具,例如 SCons,必须调整类似的并发设置。

-j 设置,特别是对于大的值 -j, 必须考虑 CPU 负载
客户端。 可能需要采取其他措施来减少客户端负载。 例如,
应该使用辅助锁严格限制并发链接。 的效果
其他构建活动,例如构建混合代码时的 Java 编译,应该是
经过考虑的。 这 --localslots_cpp 参数默认设置为 16。这限制了
在普通 distcc(非泵)模式下进行预处理的并发进程数。
因此,较大 -j 可以使用大于 16 的值而不会使单 CPU 客户端过载
由于预处理。 如此大的值可能会加速构建中不
涉及 C 编译,但它们可能对普通模式下的 distcc 效率没有用。

相比之下,使用泵模式并假设有 40 个服务器,设置为 -j80 或更大可能是
甚至适用于单 CPU 客户端。

强烈建议您在所有机器上安装相同的编译器版本
参与构建。 不兼容的编译器可能会导致神秘的编译或链接
失败。

快速开始


1 对每台机器,下载distcc,解压,安装。

2 在每台服务器上,运行 光盘 --守护进程 - 允许 限制选项
访问。

3 将服务器的名称放入您的环境中:
$ export DISTCC_HOSTS='localhost red green blue'

4 建造!
$ make -j8 CC=distcc

快速开始 用于 DISTCC-泵 MODE


继续如上,但在第 3 步中,指定远程主机将承担
预处理和通过网络发送的文件应该被压缩:

$ export DISTCC_HOSTS='--randomize localhost red,cpp,lzo green,cpp,lzo
蓝色,cpp,lzo'

--随机化 选项强制统一使用编译服务器。 虽然你会得到
只需几台服务器即可从 distcc 的泵模式中受益,您将获得越来越多的好处
使用更多服务器 CPU(多达数百个!)。 将您的构建包装在泵命令中,
这里假设有 10 个服务器:

$ distcc-pump make -j20 CC=distcc

如何 平原 (非泵) 区域中心 工作


distcc 只远程运行编译器和汇编器。 使用普通的 distcc,
预处理器必须始终在本地运行,因为它需要访问各种头文件
志愿者身上可能不存在或可能不相同的本地机器。 这
链接器同样需要检查库和目标文件,因此必须在本地运行。

编译器和汇编器只需要一个输入文件(预处理源)和
生成单个输出(目标文件)。 distcc 将这两个文件传送到
网络,因此可以远程运行编译器/汇编器。

幸运的是,对于大多数运行预处理器的程序来说相对便宜,并且
链接器被称为相对不频繁,所以大部分工作都可以分发。

distcc 检查其命令行以确定正在调用这些阶段中的哪个阶段,并且
是否可以分配工作。

如何 DISTCC-泵 MODE 工作


在泵模式下,distcc 也远程运行预处理器。 为此,预处理器必须
可以访问它在本地运行时会访问的所有文件。 在
因此,泵模式,distcc 收集所有递归包含的标头,除了
默认系统头文件,并将它们与源文件一起发送到
编译服务器。

在 distcc-pump 模式下,服务器将所有源文件的集合解压到一个临时的
目录,其中包含一个目录树,该目录树反映了文件系统的一部分
与预处理相关,包括符号链接。

编译器然后从对应于临时目录中的路径运行
客户端上的当前工作目录。 查找和传输数百个文件
通常是单个编译的一部分,泵模式使用增量包含
分析算法。 包含服务器是一个实现此功能的 Python 程序
算法。 distcc-pump 命令启动包含服务器,以便在整个构建过程中
它可以通过 distcc 命令回答包括查询。

包含服务器使用宏语言的静态分析来处理条件
编译和计算包括。 它使用的特性是当给定的头文件具有
已经分析了包含,如果所有包含,则不需要再次这样做
选项 (-I's) 不变(以及其他条件)。

对于大型构建,头文件平均每个包含数百次。 和
distcc-pump 模式每个这样的文件只被分析几次,也许只是一次,而不是
经过数百次预处理。 此外,每个源文件或头文件现在都是
只压缩一次,因为包含服务器记住压缩文件。 作为一个
结果,用于准备编译的时间可能会减少一个数量级
对普通 distcc 的预处理。

因为在泵模式下的 distcc 能够以大约十倍的速度推出文件,构建
与普通的 distcc 模式相比,大型构建的速度可能会提高 3 倍或更多。

限制 用于 PUMP MODE


使用泵模式需要客户端和服务器使用 3.0 或更高版本的 distcc 和
distccd(分别)。

增量包括对分布式泵模式的分析基于基本假设
源文件和头文件在构建过程中不会改变。 一些复杂的构建
系统,如 Linux 内核 2.6,不能完全满足这个要求。 到
克服这些问题,以及其他极端情况,例如包含中的绝对文件路径,请参见
包括服务器(1) 手册页。

另一个重要的假设是所有机器的包含配置必须是
完全相同的。 因此默认系统路径下的标头在所有服务器上必须相同
和所有客户。 如果使用标准的 GNU 编译器安装,则此要求
适用于所有头文件安装在下面的库 / usr / include or
/usr/本地/包括/。 请注意,安装软件包通常会导致额外的
头文件被放置在任一的子目录中。

如果此假设不成立,则可以使用 distcc-pump 破坏构建
模式,或更糟的是,在没有警告的情况下得到错误的结果。 目前这个条件不
已验证,它在我们的待办事项列表中以解决此问题。

保证包含配置相同的一种简单方法是使用交叉
定义默认系统搜索路径的编译器,仅限于
编译器安装。

查看 包括服务器(1) 有关违规现象和原因的更多信息的手册
distcc 泵模式假设。

OPTION 概要


大多数传递给 distcc 的选项被解释为编译器选项。 以下选项
由 distcc 本身理解。 如果指定了这些选项中的任何一个,distcc 将不会
调用编译器。

- 帮帮我 显示摘要说明。

- 版
显示 distcc 客户端版本。

--显示主机
显示 distcc 将使用的主机列表。 请参阅主机规格部分。

--扫描包括
显示 distcc 将发送到远程机器的文件列表,如
由包含服务器计算。 这是一个保守的(过度)近似
将由 C 编译器读取的文件。 此选项仅适用于泵模式。
有关如何计算的详细信息,请参阅“Distcc-pump 模式的工作原理”部分。

列表输出由 分区 --扫描包括 每行将包含一个条目。 每个
行包含一个类别,后跟一个路径。 类别是 FILE、SYMLINK、
目录或系统目录:

文件 表示将发送到 distcc 服务器的源文件或头文件
主办。

符号链接 表示将发送到 distcc 服务器主机的符号链接。

目录 表示编译源代码可能需要的目录
文件。 例如,可能需要目录“foo”,因为包含
表单 #include "foo/../bar.h"。 此类目录将在 distcc 上创建
服务器主机。

系统目录 表示系统包含目录,即位于
编译器的默认包含路径,例如“/ usr / include"; 这样的目录是
假定存在于 distcc 服务器主机上,因此不会发送到
distcc 服务器主机。

-j 显示distcc的并发级别,根据主机列表计算; 它是
此客户端向所有服务器发出的最大未完成作业数。 经过
默认情况下,这将是主机列表中主机数量的四倍,除非
主机列表中使用了 /LIMIT 选项。 请参阅主机规格部分。

安装 区域中心


有三种不同的方式来调用 distcc,以适应不同的情况:

distcc 可以安装在真实编译器的名字下,拦截对
它并远程运行它们。 这个“伪装”的编译器具有最广泛的兼容性
使用现有的源代码树,并且当您想对所有人使用 distcc 时很方便
汇编。 使用 distcc 的事实对 makefile 是透明的。

distcc 可以添加到编译器命令行,例如“distcc cc -c hello.c”
或 CC="distcc gcc"。 当您只想将 distcc 用于某些情况时,这很方便
编译或尝试一下,但可能会导致某些 makefile 或
假设 $CC 不包含空格的 libtool 版本。

最后,可以直接使用 distcc 作为编译器。 “cc”始终用作
在这种“隐式”模式下真实编译器的名称。 这可以方便
当“显式”模式不起作用但并不真正推荐时的交互使用
用于新用途。

请记住,您不应同时使用两种方法来调用 distcc。 如果你
正在使用伪装目录,不要更改 CC 和/或 CXX,只需提前放置目录
在你的路径上。 如果您不使用伪装目录,则需要更改 CC
和/或 CXX,或修改 makefile(s) 以显式调用 distcc。

伪装


基本思想是创建一个“伪装目录”,其中包含来自名称的链接
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 中出现的目录之前
包含同名的实际编译器,以及任何辅助程序
这些编译器调用(例如 as 或 ld)也必须在 PATH 目录中找到
在 masquerade 目录之后,因为 distcc 使用 PATH 调用真正的编译器
修剪掉伪装目录之前的所有目录的值。

在伪装模式下可能会出现“递归错误”,这意味着distcc是
以某种方式再次找到自己,而不是真正的编译器。 这可以表明您有两个
PATH 上的伪装目录,可能是因为在其中安装了两个 distcc
不同的位置。 它还可以表明您正在尝试混合“伪装”和
“显式”操作。

可以通过使用 shell 脚本而不是链接来避免递归错误。 例如,在
/usr/lib/distcc/bin 创建一个文件 cc,其中包含:

#!/ bin / sh的
distcc /usr/bin/gcc "$@"

这样,我们就不必依赖于 distcc 必须通过调查来定位真正的 gcc
PATH 变量。 相反,显式提供了编译器位置。

使用 区域中心 高速缓存


ccache 是一个通过缓存编译结果来加速软件构建的程序。
ccache 通常在 distcc 之前调用,以便从正常的检索结果
缓存。 制作特殊的 makefile 可能需要一些实验
一切都一起工作。

最可靠的方法是设置

CCACHE_PREFIX="distcc"

这告诉 ccache 运行 distcc 作为真正编译器的包装器。 ccache 仍在使用
真正的编译器来检测编译器升级。

然后可以使用伪装目录运行 ccache or 通过设置

抄送=“缓存” 海湾合作委员会”

从 2.2 版开始,ccache 不会缓存来自预处理源的编译,因此将
如果从 distccd 或 distcc 运行,则永远不会命中缓存。 它必须仅在
客户端和之前的 distcc 没有任何用处。

distcc 的泵模式与 ccache 不兼容。

HOST 规格


“主机列表”告诉 distcc 使用哪些机器进行编译。 按顺序,distcc 看起来
,在 $DISTCC_HOSTS 环境变量,用户的 $DISTCC_DIR/主机 文件,以及
系统范围的主机文件。 如果找不到主机列表,distcc 会发出警告并编译
本地。

主机列表是一个简单的以空格分隔的主机规范列表。 最简单的
最常见的形式是主机名,例如

本地 红色 墨绿色 蓝色

distcc 更喜欢主机在列表的开头,所以机器应该列在
速度降序排列。 特别是,当只能运行单个编译时(例如
与配置脚本一样),使用列出的第一台机器(但请参阅 --随机化 下文)。

配售 本地 在列表中的正确位置对于获得良好的性能很重要。
因为在本地运行作业的开销很低,所以 localhost 通常应该是第一个。
但是,重要的是客户端有足够的空闲周期来运行本地作业和
distcc 客户端。 如果客户比志愿者慢,或者如果有很多
志愿者,那么客户应该放在列表的后面或根本不放在列表中。 作为一般
规则,如果客户端的总 CPU 速度小于总 CPU 速度的五分之一,则
客户应该被排除在列表之外。

如果您有一个大型共享构建集群和一个共享主机文件,则上述规则
会导致首先尝试主机文件中的前几台机器,即使它们
可能比列表后面的机器更忙。 为避免这种情况,请放置关键字
--随机化 进入主机列表。 这将导致主机列表被随机化,即
应该稍微提高大型构建集群的性能。

有两个特殊的主机名 --本地插槽--localslots_cpp 这对
调整本地机器的负载。 这 --本地插槽 主机指定了多少作业
不能远程运行,可以在本地机器上并发运行,而
--localslots_cpp 控制有多少预处理器将在本地并行运行
机器。 调整这些值可以提高性能。 大型项目的链接可能需要
大量内存。 运行无法远程执行的并行链接器,
可能会强制机器交换,这会降低性能,而不是仅在其中运行作业
顺序而不交换。 使并行预处理器的数量恰到好处
允许您在 make 中使用更大的并行因子,因为本地机器现在有一些
测量本地资源使用的机制。

最后是主机入口

性能取决于用于项目的源代码和生成文件的详细信息,以及
机器和网络速度。 试验不同的主机列表设置
-j 因素可能会提高性能。

语法是

DISTCC_HOSTS = 主机规格 ...
HOSTSPEC = LOCAL_HOST | SSH_HOST | TCP_主机 | OLDSTYLE_TCP_HOST
| 全局选项
| 零配置
LOCAL_HOST = 本地主机[/LIMIT]
| --localslots=
| --localslots_cpp=
SSH_HOST = [用户]@HOSTID[/LIMIT][:COMMAND][选项]
TCP_HOST = HOSTID[:PORT][/LIMIT][选项]
OLDSTYLE_TCP_HOST = 主机ID[/限制][:端口][选项]
主机 ID = 主机名 | IPV4 | IPV6
选项 = ,选项[选项]
选项 = lzo | cp
GLOBAL_OPTION = --随机化
零配置 = +零配置

以下是语法的一些单独示例:

本地
字面词“localhost”被特别解释为导致编译
直接执行,而不是传递给本地机器上的守护进程。 如果你这样做
想要连接到本地机器上的守护进程进行测试,然后给出
机器的 IP 地址或真实主机名。 (这会更慢。)

IPV6 用方括号括起来的文字 IPv6 地址,例如 [::1]

IPV4 文字 IPv4 地址,例如 10.0.0.1

主机名
要使用解析器查找的主机名。

:港口 连接到指定的十进制端口号,而不是默认的 3632。

@主机ID
通过 SSH 而不是 TCP 连接到主机。 SSH 连接的选项可以
设置在 的〜/ .ssh /配置

用户@ 以指定的用户名通过 SSH 连接到主机。

:命令
通过 SSH 连接,并使用指定路径查找 distccd 服务器。 这是
通常仅在由于某种原因您无法将 distccd 安装到目录中时才需要
在 SSH 连接的默认 PATH 上。 如果您收到类似“distccd:
命令未找到”在 SSH 模式下。

/限制 可以在任何主机规范中添加小数限制以限制数量
此客户端将发送到机器的作业。 每个限制默认为四个
主机(本地主机有两个),但可能会受到服务器的进一步限制。 你应该
只需要为具有两个以上处理器的服务器增加此项。

, lzo 为此 TCP 或 SSH 主机启用 LZO 压缩。

,cp 为此主机启用 distcc-pump 模式。 注意:构建命令必须包含在
distcc-pump 脚本以启动包含服务器。

--随机化
执行前随机化主机列表的顺序。

+零配置
本篇 选项 is 仅由 可使用 if 分区 编译 阿瓦希 SUPPORT 启用 at
配置 时间。 当这个特殊条目出现在主机列表中时,distcc 将
使用 Avahi Zeroconf DNS 服务发现 (DNS-SD) 来定位任何可用的 distccd
本地网络上的服务器。 这避免了显式列出主机的需要
distcc 服务器机器的名称或 IP 地址。 distccd 服务器必须有
以 distccd 的“--zeroconf”选项开始。 一个重要的警告是
在当前的实现中,泵模式 (",cpp") 和压缩 (",lzo") 将
永远不要用于通过 zeroconf 定位的主机。

这是一个示例,展示了一些可能性:

本地主机/2 @bigman/16:/opt/bin/distccd 旧机:4200/1
# 卡特曼 is 向下
遥远的/3,lzo

主机规范中允许注释。 注释以井号/磅符号 (#)
并跑到行尾。

如果列表中的主机不可访问,distcc 将发出警告并忽略该主机
大约一分钟。

压缩


伊佐 主机选项指定 LZO 压缩应用于数据传输,
包括预处理的源代码、目标代码和错误消息。 压缩通常是
在低于 100Mbps 的网络上经济实惠,但结果可能因网络而异,
处理器和源代码树。

启用压缩使 distcc 客户端和服务器使用更多的 CPU 时间,但更少
网络流量。 增加的 CPU 时间对于泵模式来说是微不足道的。 压缩
源代码的比率通常为 4:1,目标代码的比率通常为 2:1。

使用压缩要求客户端和服务器至少使用 distcc 2.9 版。
不需要服务器配置:服务器总是以压缩回复来响应
压缩请求。

泵模式要求服务器打开 lzo 主机选项。

搜索 路径


如果编译器名称是绝对路径,则将其逐字传递给服务器,并且
编译器从该目录运行。 例如:

分区 /usr/local/bin/gcc-3.1415 -c 你好ç

如果编译器名称不是绝对的,或者不是完全限定的,则搜索 distccd 的 PATH。
当 distcc 从伪装目录运行时,只有编译器的基本名称是
用过的。 客户端的 PATH 仅用于运行预处理器,对
服务器的路径。

超时


distcc 客户端和服务器都对网络上的数据传输施加超时。
这旨在检测停机或无法访问的主机,并防止编译
如果服务器在使用时断开连接,则无限期挂起。 如果客户端超时
到期,作业将在本地重新运行。

目前无法配置超时。

诊断


来自本地或远程编译器的错误消息或警告被传递到诊断
客户端输出。

当使用详细选项时,distcc 可以提供大量的调试信息。 这个
是受 DISTCC_VERBOSE 客户端上的环境变量,以及 --详细
服务器上的选项。 要进行故障排除,请检查客户端和服务器错误
消息。

退出 编码


distcc 的退出代码通常是编译器的退出代码:成功编译为零
否则非零。

distcc 区分“真正的”错误,例如源代码中的语法错误,以及
“意外”错误,例如连接到志愿者的网络问题。 在这种情况下
对于意外错误,distcc 将在本地重试编译,除非 DISTCC_FALLBACK
选项已被禁用。

如果编译器有信号退出,distcc 返回退出码 128 加上信号
数。

distcc 内部错误导致退出代码介于 100 和 127 之间。特别是

100 一般 distcc 故障。

101 错误的论点。

102 绑定失败。

103 连接失败。

104 编译器崩溃。

105 内存不足。

106 坏主机规格

107 I / O错误

108 截断。

109 协议错误。

110 在远程主机上找不到给定的编译器。 检查是否设置了 $CC
并且它安装在搜索路径上的目录中
分区

111 递归调用distcc。

112 放弃特权失败。

113 网络访问被拒绝。

114 正在被另一个进程使用。

115 没有这样的文件。

116 未定义主机并禁用回退。

118 超时。

使用 onworks.net 服务在线使用 distcc


免费服务器和工作站

下载 Windows 和 Linux 应用程序

Linux 命令

Ad