Gcc 如何使用distcc只远程预处理和编译所有内容?

Gcc 如何使用distcc只远程预处理和编译所有内容?,gcc,build,g++,distributed,distcc,Gcc,Build,G++,Distributed,Distcc,背景: 我有一个128核的服务器,我想用它作为构建服务器 我有一堆客户端机器,它们与一台不太新、功能也不太强大的PC一起工作。(无法升级!不在我的控制范围内。) 我所做的: 我跟着火车走 并在服务器上安装了一个虚拟机,其编译器版本和distcc版本完全相同——基本上与客户机上的版本相同 配置客户端和服务器后,我可以远程构建。我可以使用distccmon text工具验证这一点。我可以在服务器上看到,由distcc守护进程启动的8个线程正在等待构建作业的到来。这是很好的第一步。您可以看到下面

背景:

  • 我有一个128核的服务器,我想用它作为构建服务器
  • 我有一堆客户端机器,它们与一台不太新、功能也不太强大的PC一起工作。(无法升级!不在我的控制范围内。)
我所做的:

  • 我跟着火车走
  • 并在服务器上安装了一个虚拟机,其编译器版本和distcc版本完全相同——基本上与客户机上的版本相同
  • 配置客户端和服务器后,我可以远程构建。我可以使用
    distccmon text
    工具验证这一点。我可以在服务器上看到,由distcc守护进程启动的8个线程正在等待构建作业的到来。这是很好的第一步。您可以看到下面的输出以确定

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

  • 第一个问题:无论我如何配置distcc,它总是试图在客户端和服务器上平均分配构建作业。即使我的配置文件如下所示:
  • 根据,应该为生成服务器提供更高的优先级,而为本地主机提供更低的优先级,因为它位于列表的后面。此外,它应该为构建服务器提供8个作业,为本地主机提供0个作业。但不,那不会发生。键入
    make-j8
    后,它尝试在本地主机上启动4个线程,在远程主机上启动4个线程。不好的。这可以从下图中看到

  • 第二个问题:您还会注意到,预处理是在本地计算机上完成的。为此,distcc附带了一个工具。它被称为“distcc泵”或泵模式,可以这样使用
  • 不幸的是,无论是否为泵模式,预处理都发生在
    localhost
    上,如上图所示。悲哀

    注意:对于我在这里列出的配置,
    distcc
    程序在任何时候都不会在服务器或客户端上抛出任何错误或警告

    版本:

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


    对于如何改进此设置/(修复问题)的任何建议和反馈,我们都非常欢迎。

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


    试用

    • 删除/etc/distcc/hosts c.f中与localhost相关的行

    • 或者在/etc/distcc/hosts c.f中指定127.0.0.1而不是localhost。在中使用该替换解决了另一个问题


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

    根据手册页,“localhost”是专门解释的。这似乎对你不起作用。另一种语法是
    --localslots=
    。你测试过这个吗

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

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

    $ cat ~/.distcc/hosts
    172.24.26.208/128,cpp,lzo
    $ make -j 128
    ...
    
    然后我希望在本地机器上看不到任何编译作业


    手册页上还有一些关于推荐工作编号的文字。搜索以distcc开头的部分,将作业分布到本地和远程CPU。

    确定。谢谢你的提示,布鲁诺。午饭后让我试试。我会回复您。从包含主机的文件中删除
    localhost
    无效。它仍然会将构建作业提供给本地主机。第二部分(vis-a-vis 127.0.0.1,而不是localhost),我仍然必须尝试使用distcc,还有一个不使用distcc,而是
    ssh 172.24.26.208“cd…;gcc-j8…
    ;-)<代码>三个点<代码>o.o。好啊一旦我能再次使用那台机器进行测试,我也会试一试。再次感谢您的时间@bruno!非常感谢!我终于可以使用测试机了,我尝试了很多方法,将
    localhost/0
    行替换为
    127.0.0.1/0
    -->这会将所有构建任务发送到localhost,即使构建服务器在hosts列表中位于其上方
    127.0.0.1/1
    -->这与
    localhost
    具有相同的效果,这意味着构建被一分为二。完全删除
    localhost/127.0.0.1
    行也会将任务分配一半。非常感谢您的回复。我会在下个星期尝试一下,然后再给你回复。
    time pump make CC="distcc gcc" CXX="distcc g++" -j8
    
    $ cat ~/.distcc/hosts
    172.24.26.208/128,cpp,lzo
    $ make -j 128
    ...