【问题标题】:Is make -j distcc possible to scale over 5 times?make -j distcc 是否可以扩展超过 5 倍?
【发布时间】:2010-01-05 14:41:13
【问题描述】:

由于distcc不能保持状态,只能发送job和headers,让那些服务器只使用刚刚发送的数据和预处理和编译,我认为最新的distcc在可伸缩性方面存在问题。
在我的本地构建环境中,它有 appx.要构建 10,000 个 c/c++ 文件,当有 20 个构建服务器时,我只能比不使用 distcc(但使用 make -j)快 2 倍。
你认为是什么问题?

如果有人使用 make -j 和 distcc 实现了 10 到 20 倍以上的可扩展性,请告诉我。

以下产品声称无法将 make -j 和 distcc 的扩展速度提高 5 倍以上。 http://www.electric-cloud.com/products/electricaccelerator.php

我认为这可以通过以下方式改进:

  • 让 distccd 服务器维护会话
  • 与这些会话相关联,它们将缓存自己的标头目录
  • 预处理将根据 distccd 服务器的需求完成
  • 这将通过 LD_PRELOADed 库 libdistcc.so 完成,该库将替换 stat/open 系统调用并通过网络获取头文件。 ...

有人做过这种事吗?


我认为 Electric Cloud 做了类似的事情,但我认为我们还有更多的空间可以优化:

  1. 服务器应该通过非常快速的网络文件系统共享相同的源代码存储库。
  2. 我们应该并行进行构建文件解析和包含头解析。

  3. 在不大幅更改构建描述的情况下似乎相当困难。
    欢迎任何想法、现有技术、解决方法。

【问题讨论】:

  • 你也试过使用 ccache 吗?两者相得益彰。
  • 是的,当然,但我对 ccache 改进没有太大兴趣,因为我的构建系统已经可以避免基于 fixdep 的重建,基本上与 kbuild 相同。

标签: gcc build makefile scalability distributed


【解决方案1】:

是的,distcc 可以扩展到 5 倍以上。

我们必须弄清楚您的环境中的限制因素是什么。

  1. 一个常见问题是您的 makefile 不允许它一次实际调度多个文件。你可以看看有多少编译器进程正在运行。如果这是问题所在,您可能需要调试您的 makefile 以实现更多并行性。

  2. 可能客户端正在运行的许多作业由于某种原因无法分发。 distcc 客户端日志会告诉您是否是这种情况。

  3. 可能由于某种原因,客户端超载,无法足够快地传递作业;但是,您很可能会在达到此目标之前获得 2 个以上的工作。

  4. 可能是服务器超载,无法接受更多作业。但是,如果您有 20 台服务器,它们应该能够每台至少使用一台。

  5. 可能网络已经饱和,客户端和服务器都阻塞了它(不太可能在 GbE 上;可能在 100Mb 上。)

在您知道限制因素是开始会话之前,考虑保持会话打开的技巧还为时过早。

可能是 #1 或 #2。发布您的日志摘录。

【讨论】:

  • 嗯,基本上找依赖链过度序列化的原因。也许它是一种递归制作,并且一次只为每个目录构建少量文件。也许规则中有一个 shell for 循环。
  • 第1-4点在我的环境中都解决了。我说的是理想情况下,即使使用泵模式之类的技术,distcc 也会出现问题:它发送所有头文件并让 distccd 也进行预处理。
  • 从逻辑上讲,必须始终存在一个速率限制因素——这些不是你最终可以“解决”的问题——你只需要弄清楚它是什么。客户端或服务器上是否有空闲内核?网络满了吗?客户端进程是在等待磁盘、等待来自服务器的响应还是其他什么? distcc-mon 显示什么?
  • stackoverflow.com/users/724314/matt-hargett 在被拒绝的编辑中还建议,通常通过包含您使用的内容来优化编译时间的源代码会有所帮助。当然,它也会帮助本地构建。
猜你喜欢
  • 1970-01-01
  • 2010-12-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多