在将OSX更新到High Sierra并将Xcode更新到9.2.0之后,大型项目的项目构建时间变得难以控制。构建时间从大约10分钟增加到大约120分钟。
在研究过程中,我注意到Xcode产生的xcexec
子进程占用了大部分的cpu使用率。xcexec
几乎所有的时间都在调用系统的close
调用。每个xcexec
进程每分钟调用大约200万次close调用。
在检查xcexec
二进制文件时,这似乎是一个用于启动其他构建操作(例如clang)的包装工具。
我已经完全重新安装了Xcode,没有任何改变。构建系统设置为默认值。
是什么导致了这种行为?
发布于 2018-02-02 23:20:17
installation instructions for watchman会指导您这样设置kern.maxfiles
:
$ sudo sysctl -w kern.maxfiles=10485760
$ sudo sysctl -w kern.maxfilesperproc=1048576
在macOS高山上,这两个值的默认设置均为131072。Watchman的建议是对内核的性能关键设置进行80倍的更改。调整这些值可能会导致不同的性能特征,特别是对于文件繁重的操作,如编译。
Watchman更改了限制,以便允许它同时查看更多文件。
然而,Xcode会开始索引你的项目,并打开尽可能多的文件(通过kern.maxfiles
)。在编译阶段,Xcode启动xcexec
,它将关闭所有打开的文件描述符进行索引,然后才启动构建步骤子过程。该操作应该几乎不需要任何时间。但在更改了kern.maxfiles
之后,它突然发生了变化。
我在2015年年中的macOS 10.13.3,Xcode9.2.0上进行了基准测试。
根据我的基准测试,kern.maxfilesperproc
对Xcode`s的构建性能没有影响。
一旦kern.maxfiles
超过327680,Xcode构建的性能就会受到严重影响。
如果您需要支持具有更大项目的watchman,我建议将kern.maxfiles
设置为(不大于) 327680。
请注意,使用sysctl
设置kern.maxfiles
在重新启动后不会持久存在。/Library/LaunchDaemons/limit.maxfiles.plist
中的Adjust the values。
https://stackoverflow.com/questions/48585732
复制相似问题