2013-02-21 52 views
3

我们正在为我们非常庞大而复杂的企业应用程序尝试Gradle。我们正在使用多个项目构建结构,并对Gradle的并行执行功能感到非常兴奋。Debug Gradle的并行模式

我们的代码库被域层结构是这样的:

UI模块(〜20) - >共享UI - >域 - >道 - >框架

依存关系是单向的,并构建发生自下而上。

不幸的是,我们并没有看到在我们的构建次大的推动作用。它与我们之前用蚂蚁得到的结果几乎相同。

望着任务并行模式几件事的执行顺序看起来不正确的。 我们的期望是,Gradle将在构建核心层时首先按顺序运行任务。因此,在它组装框架,dao,域和共享ui之后,它应该并行执行其他所有操作。

但我们所看到的执行顺序是有点像这样:

framework.assemble - > dao.assemble - > domain.assemble - > shared.ui.assemble - >其他UI modules.assmble(并行) - > war - >其他UI.check + shared.ui.check + dao.check(并行) - > domain.check - > framework.check

瓶颈在运行检查域和顺序框架而不是并行。这两个模块对我们来说是最大的模块,大约有12k个单元测试,他们需要大约4分钟才能运行。

我们花了很多时间在看的gradle使用任务的依赖性--all并为这些模块测试任务是完全独立的,并没有什么应该推迟其执行。

我们想知道,如果这是一个已知的问题或是否有一种方法,使在摇篮一些额外的调试,以获得更多的洞察力摇篮如何确定并行方式执行顺序。任何帮助表示赞赏。

回答

3

作为摇篮1.4的,并行任务执行是(有意)在几个方面受到限制。特别是,随时执行的一组任务不会包含属于同一项目的两个任务。这将随着时间的推移而改善。除了从日志中获得的信息外,我不知道有任何调试帮助(例如,使用--debug)。

注意,并行测试执行是一个单独的特征。如果您在同一个项目中进行了大量测试,那么x> 1的test.maxParallelForks = x应该显示明显的加速。 x的值最好通过实验确定。一个好的起点是机器上物理内核的数量(例如Runtime.getRuntime().availableProcessors()/2)。

+0

**特别是,随时执行的一组任务不会包含属于同一个项目的两个任务。** 这是非常有用的信息。那么,并行模式下项目的任务粒度是多少?检查被认为是一个任务或测试或pmd是任务?它在根项目和子项目之间有什么不同? 不幸的是,对我们来说** maxParallelForks **根本不起作用。我们已经尝试将其设置为最小有用值2,并且构建失败。它很快就会在OSX上遇到“系统中打开的文件过多”错误。 – abhi 2013-02-22 01:51:17

+0

任务的粒度总是相同的。所有的'check','test','pmd'都是任务(实际上我认为它是'pmdMain')。根项目和子项目没有区别。当然,并行化时要考虑任务图,但还要强制执行同一项目中没有两个任务可以并行运行的限制。你正在使用哪个Gradle版本?如果您遇到'maxParallelForks'问题,请在http://forums.gradle.org上报告。也尝试增加打开文件的最大数量(应该很容易在* nix上)。 – 2013-02-22 07:11:07