在将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
中的值。