使用 Instruments 进行性能分析

Instruments 可用于内存分析和统计性能分析。

官方 Apple 文档

基本用法

  • 从“选择用于:”对话框中选择“时间探查器”。

  • 在左上角,记录和暂停按钮旁边,将显示“[机器名称] > 所有进程”。单击“所有进程”,然后从“正在运行的应用程序”部分选择“firefox”。

  • 单击记录按钮(左上角的红色圆圈)

  • 等待您要分析的时间段

  • 单击停止按钮

命令行工具

instrumentsiprofiler

我们如何监控性能计数器(缓存未命中等)?Instruments 有一个“计数器”工具可以做到这一点。

内存分析

Instruments 将在每个分配点记录一个调用栈。调用树视图在这里非常有用。从“统计信息”切换。此 malloc 分析是使用 malloc_logger 基础设施(类似于 MallocStackLogging)完成的。目前,这意味着您需要禁用 jemalloc 构建(ac_add_options --disable-jemalloc)。您还需要 Bug 719427 的修复。

内核栈

在“文件” -> “记录选项”下,您可以启用“记录内核调用栈”。要获取完整的符号,而不仅仅是导出的符号,您需要安装匹配的 内核调试工具包。确保您安装的 macOS 版本与您的版本完全匹配,包括末尾的标识符(例如,“12.3.1 (21E258)”)。

允许 Instruments 查找内核符号

安装 KDK 通常不足以让 Instruments 找到符号。Instruments 使用 Spotlight 查找具有匹配 UUID 的 dSYM,因此您需要将 dSYM 放置在 Spotlight 将对其进行索引的位置。

首先,检查 macOS 安装的内核的 UUID。为此,运行以下命令

% dwarfdump --uuid /System/Library/Kernels/kernel.release.t6000
UUID: C342869F-FFB9-3CCE-A5A3-EA711C1E87F6 (arm64e) /System/Library/Kernels/kernel.release.t6000

然后,在您安装的 KDK 中找到相应的 dSYM 文件,并对其运行 mdls。例如

% mdls /Library/Developer/KDKs/KDK_12.3.1_21E258.kdk/System/Library/Kernels/kernel.release.t6000.dSYM

(确保您使用 .release 变体,而不是 .development 变体或任何其他变体。)

如果 mdls 的输出包含字符串 com_apple_xcode_dsym_uuids 且 UUID 匹配,则您已完成。

否则,尝试将 kernel.release.t6000.dSYM 捆绑包复制到您的主目录,然后对复制的文件运行 mdls。例如

% cp -r /Library/Developer/KDKs/KDK_12.3.1_21E258.kdk/System/Library/Kernels/kernel.release.t6000.dSYM ~/
% mdls ~/kernel.release.t6000.dSYM
_kMDItemDisplayNameWithExtensions      = "kernel.release.t6000.dSYM"
com_apple_xcode_dsym_paths             = (
    "Contents/Resources/DWARF/kernel.release.t6000"
)
com_apple_xcode_dsym_uuids             = (
    "C342869F-FFB9-3CCE-A5A3-EA711C1E87F6"
)
kMDItemContentCreationDate             = 2022-03-21 15:25:57 +0000
[...]

现在 Instruments 应该能够获取内核符号。

其他

DTPerformanceSession api 可用于控制来自应用程序的性能分析,例如我们在 Shark 构建中使用的旧 CHUD API。 Bug 667036

系统跟踪可能有用。