对于 .c 和 .m 文件,Xcode 构建速度很慢



在将OSX更新到High Sierra并将Xcode更新到9.2.0之后,大型项目的项目构建时间失控了。构建时间从 ~10 分钟到 ~120 分钟不等。

在研究过程中,我注意到 Xcode 生成了xcexec子进程,这些进程占用了大部分 CPU 使用率。xcexec几乎所有时间都在呼叫系统close呼叫。每个xcexec进程每分钟调用大约 200 万个关闭调用。

在检查xcexec二进制文件时,这似乎是用于启动其他构建操作(例如 clang)的包装工具。

我已经完全重新安装了Xcode,没有任何变化。生成系统设置为默认值。

是什么原因导致这种行为?

守望者的安装说明指示您像这样设置kern.maxfiles

$ sudo sysctl -w kern.maxfiles=10485760
$ sudo sysctl -w kern.maxfilesperproc=1048576

这两个值的默认设置(两个)在 macOS High Sierra 上131072。Watchman 的建议是对内核的性能关键设置进行 80 倍的更改。调整这些值可能会导致不同的性能特征,尤其是对于编译等文件密集型操作。

守望者更改了限制,以便允许它同时观看更多文件。

但是,Xcode 将开始索引您的项目并打开尽可能多的文件(通过kern.maxfiles)。在编译阶段,Xcode 会启动xcexec它将关闭所有打开的文件描述符以进行索引,然后才启动构建步骤子进程。该操作几乎不需要时间。但是在改变kern.maxfiles之后,它突然发生了。

我在 2015 年中期的 MBP 上进行了基准测试,macOS 10.13.3,Xcode 9.2.0。

根据我的基准测试kern.maxfilesperproc对Xcode的构建性能没有影响。

一旦kern.maxfiles高于 327680,Xcode 构建的性能就会受到严重影响。

如果您需要支持更大的项目,我建议将kern.maxfiles设置为 (没有大于)327680 的值。

请注意,使用sysctl设置kern.maxfiles不会在重新启动后持续存在。调整/Library/LaunchDaemons/limit.maxfiles.plist中的值。

最新更新