2

背景:

  • 我有一个 128 核的服务器,我想将它用作构建服务器。
  • 我有一堆客户端机器,它们与不太新且不太强大的 PC 配合使用。(无法升级!不在我的控制范围内。)

我做了什么:

  • 我遵循了distcc 文档
  • 并在服务器上安装了具有完全相同编译器版本、相同 distcc 版本的虚拟机——与客户端机器上的发行版基本相同。
  • 配置客户端和服务器后,我可以远程构建。我可以使用该distccmon-text工具验证这一点。我可以在服务器上看到,distcc 守护程序启动了 8 个线程,它们正在等待构建作业的到来。这是很好的第一步。您可以确定下面的输出。

在此处输入图像描述

  • 第二步:由于客户端机器是双核机器,而服务器提供 128 核,并且并非所有客户端都会同时编译,我想将尽可能多的构建卸载到构建服务器。

问题:

  1. 第一个问题: 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 个线程。不好。您可以从下图中看到这一点。

在此处输入图像描述

  1. 第二个问题:您还会注意到预处理是在本地机器上完成的。为此,distcc 附带了一个工具。它被称为“distcc-pump”或泵模式,可以这样使用。
time pump make CC="distcc gcc" CXX="distcc g++" -j8

不幸的是,无论泵模式与否,预处理都发生在 上localhost,如上图所示。伤心。

注意:使用我在此处列出的配置distcc的程序在任何时候都不会在服务器和客户端上抛出任何错误或警告。

版本:

  • GCC 4.4.5
  • distcc 3.2rc1.2

(在有人建议 - “升级软件!”之前,更新版本对我来说很可能是不可能的。无论如何,这个版本的 distcc 提供了我需要的功能。另外,我可以升级服务器虚拟机,但是会有编译器客户端和服务器之间的版本不匹配。我无法升级的客户端。)

任何关于如何改进此设置/(解决问题)的建议和反馈都非常受欢迎。

4

2 回答 2

0

distcc 实际上区分远程和本地 CPU。但与您的解释相反,在 hosts 文件中,IP 地址 127.0.0.1 被视为远程 CPU,并且预计将在该处运行 distccd 服务器。您在 hosts 文件中定义的任意数量的作业仅针对这些服务器节点进行解释。

根据手册页,“localhost”被特别解释。这似乎对你不起作用。另一种语法是--localslots=<int>. 你测试过这个吗?

此外, distcc 在本地主机(您启动驱动程序的主机)上运行作业。首先,所有链接都在那里完成。其次,当您使用 make -jN 指定一定的并行度时,除了 distcc 的工作负载分配部分之外,所有超出远程作业可用数量的作业也会在您的本地主机上运行。该选项--localslots限制了这些。手册页在这里没有localhost明确提及。然后是那些在服务器上失败并在本地重复的作业。

对于给定的 128 核服务器,我将使用 hosts 文件中的核数并仅启动该数量的编译作业:

$ cat ~/.distcc/hosts
172.24.26.208/128,cpp,lzo
$ make -j 128
...

然后我希望在本地机器上看不到任何编译作业。

手册页有更多关于推荐工作编号的内容。搜索以distcc spreads the jobs across both local and remote CPUs.

于 2020-01-25T14:39:23.173 回答
0

编辑:这些解决方案不起作用,我让答案避免其他人再次提出他们


试试看

于 2019-04-09T10:25:00.977 回答