Xperfview:CPU采样和CPU使用率有什么区别?

时间:2010-08-25 14:45:34

标签: sdk performance xperf

此问题涉及xperf和xperfview,这些实用程序是Windows性能工具包的一部分(反过来是Windows SDK 7.1的一部分)。

比较两个图表,“按线程进行CPU采样”和“按线程进行CPU使用”,我有几点不同之处。我将使用audiodg.exe作为示例。

  1. 在Threads下拉菜单中,CPU采样图表上只有一个用于audiodg的线程; CPU使用率图表显示了几个audiodg线程。

  2. 两个图都有一个标有“%Usage”的Y轴,但测量值不同。通常,CPU采样图表上给定线程的%使用率低于CPU使用率图表。

  3. CPU采样摘要表显示每个模块/进程的权重和%权重。如果我加载符号,我可以深入研究audiodg过程。 “CPU计划聚合摘要”表(从“CPU使用情况”图启动)显示CPU使用率和%CPU使用率 - 权重不可用。 (相反,CPU采样摘要表中没有CPU使用率。)我无法深入了解audiodg - 我只看到主线程和一些ntdll.dll线程。

  4. %CPU使用率和%权重列中任何进程的数字始终不同。有时他们的差异超过75%。

  5. 所以我的问题......这里CPU使用的可靠衡量标准是什么? CPU使用数是否来自CPU样本?这些数字不应该以某种方式相关吗?

1 个答案:

答案 0 :(得分:4)

Xperf确实让这有点令人困惑,这是我对正在发生的事情的理解:

  • 使用PROFILE内核标志启用的CPU样本数据。以一定的时间间隔收集CPU样本数据,并记录有关当时CPU正在执行的操作的信息(例如,样本时的进程,线程ID和callstack。)
  • 上下文切换数据,使用CSWITCH内核标志启用。这会记录有关发生的每个上下文切换的数据(例如,谁被切入/切出和调用堆栈。)

按线程进行CPU采样显示为每个线程记录的配置文件事件数,并在跟踪期间的某个时间间隔内进行聚合。例如,如果audiodg在10%的时间内执行了2秒钟,我们预计在此期间会看到大约10%的“使用率”。但是,因为这是基于抽样,所以在每个样本事件中,来自另一个进程的线程可能正在执行 - 换句话说,10%被样本事件'错过'。

线程的CPU使用率是使用上下文切换数据计算的。 “使用”是上下文切换然后稍后输出之间的时间量(当然,这些数据会在一小段时间内聚合)。

每个数据都有好处:

  • CPU采样实际上会告诉您在采样时 的线程是什么,因为它在执行期间收集了调用堆栈线程。上下文切换信息只会告诉您线程何时切入或切出,但之间没有任何内容。
  • 上下文切换信息将准确告诉您每个线程执行的时间。此数据是正确的。当然,抽样只是概率性的。

因此,为了回答您的问题,CPU使用率图表“更准确”,以了解每个线程执行的时间。但是,不排除使用采样数据,因为它可以更有助于了解线程实际花费时间的位置!对于CPU采样数据,摘要表更有价值,因为它将显示堆栈。对于CPU使用率数据,图表可能比汇总表更有用。

希望有所帮助!