【问题标题】:Scons Build performance for C++ in large code baseScons 在大型代码库中为 C++ 构建性能
【发布时间】:2016-11-08 12:05:08
【问题描述】:

几年来,我们一直在使用 scons 作为构建系统来开发我们的项目。 Scons 很棒,极大地改进了我们的开发过程。 最初有大约 15000 个 C++ 源文件,随着项目的发展,其他语言(Java/Scala)的源文件也被添加到代码库中。 然后我们开发了自己的构建器来管理依赖关系并调用外部工具(javac,scalac)来构建这些源,效果非常好。 最近在做当前构建系统的优化,发现C++和Java构建过程的性能差异:

环境设置: 构建具有 24 核、Python 2.7.3、Scons 2.2.0 的服务器
命令: scons --duplicate=soft-copy -j8

在构建 java 代码时,从顶部很容易观察到 CPU 使用率很高并且跨越多个内核: Java Build

但是,在构建 C++ 代码时,CPU 使用率始终约为 4%,并且仅在 1 个核心上运行无论 scons 中有多少作业C++ Build

我在互联网上搜索了很多,但找不到有用的东西。我在 Python 中遇到 GIL 问题了吗?我相信每个 gcc/g++ 命令都应该像我们自己的构建器中的 javac 一样在单独的子进程中运行,所以这里不应该有 GIL。是否有任何解决方法可以充分利用多个内核来进一步加速 C++ 构建? 提前致谢。

【问题讨论】:

  • 您可能需要设置-j 标志:stackoverflow.com/questions/414714/…
  • 您对 C++ 部分(头文件和库)的隐式依赖是否可能根本不允许进一步并行化构建步骤? SCons 本身对于较大的构建或并行处理应该没有任何问题(参见例如Why SCons Is Not Slow),并且它的 CPU 测量值在您的屏幕截图中显示完整 100%。 SCons 可能正在闲置,试图找到新的任务来生成,但当前的依赖项禁止这样做。其他大型项目(如 MongoDB)在这方面似乎没有问题.... ;)
  • @dirkbaechle 感谢您的回复,这是一个合理的猜测,DAG 的宽度最多为 N(N 仅在 1 个核心上....相比之下,Java 构建在多个核心上大量运行。
  • @dirkbaechle 我们编写了自己的工具来在工作空间的根目录中生成单个 SConstruct(~50MB)。这是一个可能的原因吗?我将作业编号增加到 12,但构建时间仍然相同。当我单独构建 Java/Scala 代码时,更高的作业数量确实会减少构建时间。
  • 当您说“构建”时,我们指的是“从头开始构建”还是“没有更改的增量构建”(空构建)?

标签: java c++ build scons


【解决方案1】:

正如 WindLeeWT 在他的一个 cmets 中解释的那样,观察到的行为的原因是在相关服务器上安装和配置了 ccache。似乎 C++ 构建期间的大部分 CPU 使用都被编译阶段占用了,由于ccache 而完全避免了这种情况。这就是为什么在top 中看不到多个内核的 CPU 使用情况。

当他们在另一台没有ccache 的服务器上启动“从头开始构建”时,几个核心在 'cc1plus -o ...' 的情况下按预期以 90% 的速度运行。

不涉及性能损失(GIL 等),Python 和 SCons 都没有显着降低性能。

【讨论】:

  • 谢谢德克。抱歉最近有点忙,忘记更新问题和我们的讨论以及问题的原因
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-17
  • 1970-01-01
  • 1970-01-01
  • 2016-08-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多