性能分析 KEXT

Utk*_*rsh 5 macos kernel-module performance-testing kernel-extension

在某些用户定义的活动期间,如何在 CPU、内存或线程使用方面衡量 OS X 中 kext 的性能影响?任何可以从用户空间使用的特定方法工具?或任何可以考虑的方法/方法?

pmd*_*mdj 4

你基本上有两个选择:

  1. 通过时间测量来检测您的 kext。在您尝试测量的操作之前和之后使用 进行标记mach_absolute_time(),使用 转换为人类可读的单位absolutetime_to_nanoseconds()并取差值,然后在您的 kext 中的某个位置收集该信息,以便可以从用户空间中提取该信息。

  2. 使用 dtrace 采样内核堆栈(iprofiler -kernelstacks -timeprofiler从命令行或使用 Instruments.app)

就我个人而言,我使用前一种方法取得了更大的成功,尽管它肯定需要更多的工作。大多数 kext 代码运行时间非常短,以至于采样分析器几乎无法捕获其执行的任何实例,除非您将采样间隔减小到测量开始干扰系统的程度,或者您的 kext 非常慢。不过这很容易做到,因此通常是有效的健全性检查。

您还可以让编译器使用计数器 ( -fprofile-arcs) 来检测您的代码,理论上这将允许您将采样统计信息与分支计数器结合起来以确定每个分支的运行时间。不过,提取这些数据是一件痛苦的事(我的代码可能会有所帮助),而且统计噪音使这在实践中对我来说毫无用处。

显式方法还允许您测量异步操作等,但当然也会带来一些固有的开销。安全地积累数据也有点棘手。(我使用原子操作,但您也可以使用自旋锁。不要忘记不仅要测量平均值,还要测量标准差和最小/最大时间。)提取数据可能很痛苦,因为您必须添加用户空间接口到你的 kext 上。但这绝对是值得的!