如何使用distcc仅对远程进行预处理和编译?

时间:2019-04-09 09:50:53

标签: gcc build g++ distributed distcc

背景

  • 我有一个128核服务器,我想用作构建服务器。
  • 我有一堆客户端计算机,它们可以与不那么新的和不那么强大的PC一起工作。 (无法升级!不在我的控制范围内。)

我做什么:

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

enter image description here

  • 第二步:由于客户端计算机是双核计算机,而服务器提供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 documentation,应该为构建服务器赋予更高的优先级,而为本地主机赋予更低的优先级,因为它在列表的后面。另外,它应将8个作业分配给构建服务器,将0个作业分配给localhost。但是不,那不会发生。键入make -j8后,它尝试执行的操作是在localhost上启动4个线程,在远程上启动4个线程。 不好。您可以从下面的图片中看到这一点。

enter image description here

  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版本提供了我所需的功能。此外,我还可以升级服务器虚拟机但是客户端和服务器之间会出现编译器版本不匹配的情况。我无法升级的客户端。)

欢迎您提出任何建议和反馈,以改进此设置/(解决问题)。

2 个答案:

答案 0 :(得分:0)

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


尝试

答案 1 :(得分:0)

distcc实际上区分远程CPU和本地CPU。但是与您的解释相反,在主机文件中,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.

开头的部分