【问题标题】:Xcode build slow for .c and .m files.c 和 .m 文件的 Xcode 构建速度很慢
【发布时间】:2018-02-02 15:20:16
【问题描述】:

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

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

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

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

是什么导致了这种行为?

【问题讨论】:

    标签: xcode macos watchman


    【解决方案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 更改限制,以便允许同时观看更多文件。

    然而,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.maxfiles 设置为 sysctl 在重新启动后不会持续存在。 Adjust the values/Library/LaunchDaemons/limit.maxfiles.plist.

    【讨论】:

    • watchman 文档的该部分仅适用于旧版本的 macOS(10.6 及更早版本)。您不应该在较新的系统上应用这些配置,因为 watchman 可以在那里使用 fsevents 并且不需要更高的文件描述符限制
    • 感谢您花时间写这篇文章!更新到 Mojave 后遇到同样的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-09-01
    • 1970-01-01
    • 2010-11-19
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    相关资源
    最近更新 更多