0

在将 OSX 更新到 High Sierra 并将 Xcode 更新到 9.2.0 之后,大型项目的项目构建时间变得一发不可收拾。构建时间从约 10 分钟到约 120 分钟。

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

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

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

是什么导致了这种行为?

4

1 回答 1

1

watchman的安装说明指导你这样设置kern.maxfiles

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

在 macOS High Sierra 上,这两个值的默认设置为 131072。Watchman 的建议是对内核的性能关键设置进行 80 倍的更改。调整这些值可能会导致不同的性能特征,特别是对于像编译这样的文件繁重的操作。

Watchman 更改了限制,以便允许同时观看更多文件。

然而,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。

请注意,设置kern.maxfileswithsysctl不会在重新启动后保持不变。调整 中的/Library/LaunchDaemons/limit.maxfiles.plist值。

于 2018-02-02T15:20:16.900 回答