使用 Instruments 进行性能分析¶
Instruments 可用于内存分析和统计性能分析。
官方 Apple 文档¶
基本用法¶
从“选择用于:”对话框中选择“时间探查器”。
在左上角,记录和暂停按钮旁边,将显示“[机器名称] > 所有进程”。单击“所有进程”,然后从“正在运行的应用程序”部分选择“firefox”。
单击记录按钮(左上角的红色圆圈)
等待您要分析的时间段
单击停止按钮
命令行工具¶
有 instruments 和 iprofiler。
我们如何监控性能计数器(缓存未命中等)?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
系统跟踪可能有用。