将OSX更新为High Sierra并将Xcode更新为9.2.0后,较大项目的项目构建时间失控。构建时间从大约10分钟到大约120分钟。
在研究时我注意到Xcode产生了xcexec
子进程,这些进程占用了大部分cpu。 xcexec
几乎所有时间都在调用系统close
。每个xcexec
进程每分钟调用大约200万次关闭调用。
在检查xcexec
二进制文件时,这似乎是启动其他构建操作(例如clang)的包装工具。
我完全重新安装了Xcode而没有任何变化。构建系统设置为默认值。
导致此行为的原因是什么?
答案 0 :(得分:1)
installation instructions for watchman指示您设置kern.maxfiles
,如下所示:
$ sudo sysctl -w kern.maxfiles=10485760
$ sudo sysctl -w kern.maxfilesperproc=1048576
这两个值的默认设置是macOS High Sierra上的131072。 Watchman的建议是对内核的性能关键设置进行80倍更改。调整这些值可能会导致不同的性能特征,尤其是对于编译等文件繁重的操作。
Watchman更改限制,以便允许同时观看更多文件。
然而,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.maxfiles
设置为sysctl
并不会在重新启动后保持不变。 /Library/LaunchDaemons/limit.maxfiles.plist
中的Adjust the values。