背景:
- 我有一个 128 核的服务器,我想将它用作构建服务器。
- 我有一堆客户端机器,它们与不太新且不太强大的 PC 配合使用。(无法升级!不在我的控制范围内。)
我做了什么:
- 我遵循了distcc 文档。
- 并在服务器上安装了具有完全相同编译器版本、相同 distcc 版本的虚拟机——与客户端机器上的发行版基本相同。
- 配置客户端和服务器后,我可以远程构建。我可以使用该
distccmon-text
工具验证这一点。我可以在服务器上看到,distcc 守护程序启动了 8 个线程,它们正在等待构建作业的到来。这是很好的第一步。您可以确定下面的输出。
- 第二步:由于客户端机器是双核机器,而服务器提供 128 核,并且并非所有客户端都会同时编译,我想将尽可能多的构建卸载到构建服务器。
问题:
- 第一个问题: distcc,无论我如何尝试配置它,总是尝试在客户端和服务器上平均分配构建作业。即使我的配置文件如下所示:
# --- /etc/distcc/hosts -----------------------
# See the "Hosts Specification" section of
# "man distcc" for the format of this file.
#
# By default, just test that it works in loopback mode.
# 127.0.0.1
172.24.26.208/8,cpp,lzo
localhost/0
根据distcc 文档,应该为构建服务器提供更高的优先级,并为 localhost 提供较低的优先级,因为它位于列表的后面。此外,它应该为构建服务器提供 8 个作业,为 localhost 提供 0 个作业。但不,这不会发生。在键入make -j8
它尝试做的是在 localhost 上启动 4 个线程,在远程启动 4 个线程。不好。您可以从下图中看到这一点。
- 第二个问题:您还会注意到预处理是在本地机器上完成的。为此,distcc 附带了一个工具。它被称为“distcc-pump”或泵模式,可以这样使用。
time pump make CC="distcc gcc" CXX="distcc g++" -j8
不幸的是,无论泵模式与否,预处理都发生在 上localhost
,如上图所示。伤心。
注意:使用我在此处列出的配置distcc
的程序在任何时候都不会在服务器和客户端上抛出任何错误或警告。
版本:
- GCC 4.4.5
- distcc 3.2rc1.2
(在有人建议 - “升级软件!”之前,更新版本对我来说很可能是不可能的。无论如何,这个版本的 distcc 提供了我需要的功能。另外,我可以升级服务器虚拟机,但是会有编译器客户端和服务器之间的版本不匹配。我无法升级的客户端。)
任何关于如何改进此设置/(解决问题)的建议和反馈都非常受欢迎。