【问题标题】:Performance profiling a KEXT性能分析 KEXT
【发布时间】:2016-12-13 20:24:58
【问题描述】:

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

【问题讨论】:

  • 致那些试图结束这个问题的人:愿意为你的“离题”和“过于宽泛”的观点辩护吗?这不是一个在任何突出的地方都有任何深度涵盖的主题,因此一个相当广泛的问题似乎是有效的。

标签: macos performance-testing kernel-module kernel-extension


【解决方案1】:

你基本上有两个选择:

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

  2. 使用 dtrace(命令行中的iprofiler -kernelstacks -timeprofiler,或使用 Instruments.app)对内核堆栈进行采样

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

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

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

【讨论】:

  • 感谢您的指导,我会尝试这些选项。
  • 不能让 os_signpost 在 kext 中工作吗?使用 Instruments 会很好。
猜你喜欢
  • 1970-01-01
  • 2019-08-16
  • 2016-07-28
  • 2011-06-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多