Gcc 如何使用distcc只远程预处理和编译所有内容?
背景:Gcc 如何使用distcc只远程预处理和编译所有内容?,gcc,build,g++,distributed,distcc,Gcc,Build,G++,Distributed,Distcc,背景: 我有一个128核的服务器,我想用它作为构建服务器 我有一堆客户端机器,它们与一台不太新、功能也不太强大的PC一起工作。(无法升级!不在我的控制范围内。) 我所做的: 我跟着火车走 并在服务器上安装了一个虚拟机,其编译器版本和distcc版本完全相同——基本上与客户机上的版本相同 配置客户端和服务器后,我可以远程构建。我可以使用distccmon text工具验证这一点。我可以在服务器上看到,由distcc守护进程启动的8个线程正在等待构建作业的到来。这是很好的第一步。您可以看到下面
- 我有一个128核的服务器,我想用它作为构建服务器李>
- 我有一堆客户端机器,它们与一台不太新、功能也不太强大的PC一起工作。(无法升级!不在我的控制范围内。)
- 我跟着火车走
- 并在服务器上安装了一个虚拟机,其编译器版本和distcc版本完全相同——基本上与客户机上的版本相同
- 配置客户端和服务器后,我可以远程构建。我可以使用
工具验证这一点。我可以在服务器上看到,由distcc守护进程启动的8个线程正在等待构建作业的到来。这是很好的第一步。您可以看到下面的输出以确定distccmon text
- 第二步:由于客户端机器是双核机器,而服务器提供128核,并且并非所有客户端都将同时编译,因此我希望将尽可能多的构建工作卸载到构建服务器
make-j8
后,它尝试在本地主机上启动4个线程,在远程主机上启动4个线程。不好的。这可以从下图中看到
localhost
上,如上图所示。悲哀
注意:对于我在这里列出的配置,distcc
程序在任何时候都不会在服务器或客户端上抛出任何错误或警告
版本:
- 通用条款4.4.5
- distcc 3.2rc1.2
对于如何改进此设置/(修复问题)的任何建议和反馈,我们都非常欢迎。编辑:这些解决方案不起作用,我会给出答案,以避免其他人再次提出它们。
试用
- 删除/etc/distcc/hosts c.f中与localhost相关的行
- 或者在/etc/distcc/hosts c.f中指定127.0.0.1而不是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
...