2016-11-08 29 views
0

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

环境设置: 构建服务器与24个核心,Python的2.7.3,2.2.0使用SCons
命令: scons的--duplicate =软拷贝-j8

当建立Java代码,CPU使用率是很容易从高顶部和跨越多个核观察到: Java Build

然而,构建C++代码时,CPU占用率始终〜4%,只有1个核心不管跑多少就业机会scons的C++ Build

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

+0

您可能需要设置'-j'标志:http://stackoverflow.com/questions/414714/compiling-with-g-using-multiple-cores – doctorlove

+0

是否有可能隐式依赖C++部分(头文件和库文件)根本不允许进一步对生成步骤进行并行处理? SCons本身不应该有更大的构建或并行处理的任何问题(参见例如[为什么SCons不慢](https://bitbucket.org/scons/scons/wiki/WhySconsIsNotSlow)),并且其CPU指标显示满100 %在你的截图。 SCons可能会空转,试图找到新的任务来产卵,但目前的依赖禁止这样做。其他大型项目(如MongoDB)在这方面似乎没有问题......; – dirkbaechle

+0

@dirkbaechle感谢您的回复,这是一个合理的猜测,DAG的宽度最多为N(N <8) 。但我仍然想知道有数百个目标需要构建,其中有很多程序肯定是依赖图的终点。但是,cpu的使用率仍然只有1核**的〜100%** ....通过对比,Java构建在几个核心上运行很多。 – WindLeeWT

回答

0

正如WindLeeWT在他的一个评论中解释的,观察到的行为的原因是ccache在相关服务器上安装和配置。看起来,C++构建期间的大部分CPU使用率都是在编译阶段完成的,由于ccache,完全避免了这一点。这就是为什么在top内没有看到几个内核的CPU使用率的原因。

只要他们在没有ccache的另一台服务器上启动“从头开始构建”,几个内核正如预期的那样以90%的“cc1plus -o ...”运行。

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

+0

谢谢德克。对不起,我最近有点忙,忘了更新问题与我们的讨论和问题的原因 – WindLeeWT