调试Gradle';s并行模式

调试Gradle';s并行模式,gradle,Gradle,我们正在为我们的大型复杂企业应用程序尝试Gradle。我们正在使用多项目构建结构,对Gradle的并行执行特性非常兴奋 我们的代码库在域层中的结构如下: UI模块(~20)->共享UI->域->dao->框架 依赖项是单向的,构建是自下而上的 不幸的是,我们在构建时间上没有看到大的提升。这和我们之前用ant得到的几乎一样 在并行模式下查看任务的执行顺序,很少有事情看起来不正确。 我们的期望是,Gradle在构建核心层时,最初会按顺序运行任务。所以,在它组装了框架、dao、域和共享ui之后,它应该

我们正在为我们的大型复杂企业应用程序尝试Gradle。我们正在使用多项目构建结构,对Gradle的并行执行特性非常兴奋

我们的代码库在域层中的结构如下:

UI模块(~20)->共享UI->域->dao->框架

依赖项是单向的,构建是自下而上的

不幸的是,我们在构建时间上没有看到大的提升。这和我们之前用ant得到的几乎一样

在并行模式下查看任务的执行顺序,很少有事情看起来不正确。 我们的期望是,Gradle在构建核心层时,最初会按顺序运行任务。所以,在它组装了框架、dao、域和共享ui之后,它应该能够并行地处理其他所有事情

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

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

瓶颈是在它按顺序而不是并行地运行域和框架检查时出现的。这两个模块是我们最大的模块,大约有12k的单元测试,运行大约需要4分钟

我们花了很多时间使用gradle任务查看依赖关系——这些模块的所有任务和测试任务都是完全独立的,没有任何东西会阻碍它们的执行


我们想知道这是否是一个已知的问题,或者是否有一种方法可以在Gradle中启用一些额外的调试,以便更深入地了解Gradle如何使用并行模式确定执行顺序。非常感谢您的帮助。

从Gradle 1.4开始,并行任务的执行(有意地)在几个方面受到限制。特别是,在任何时候执行的任务集都不会包含属于同一项目的两个任务。这将随着时间的推移而改进。除了从日志(例如使用
--debug
)获得的调试帮助外,我不知道还有其他调试帮助


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

**特别是,在任何时候执行的任务集都不会包含属于同一项目的两个任务。**这是非常有用的信息。那么,并行模式下项目任务的粒度是多少?检查是任务还是测试或pmd是任务?根项目和子项目之间有什么区别?不幸的是,对我们来说,**maxParallelForks**根本不起作用。我们尝试将其设置为最小有用值2,但构建失败。OSX很快就会出现“系统中打开的文件太多”错误。任务的粒度总是相同的。所有的
check
test
pmd
都是任务(实际上我认为是
pmdMain
)。根项目和子项目之间没有区别。当然,并行化考虑了任务图,但是另外,来自同一项目的两个任务不能并行运行的约束也被强制执行。您使用的是哪种Gradle版本?如果您遇到
maxParallelForks
问题,请在报告。同时尝试增加打开文件的最大数量(在*nix上应该很容易)。