2

这个问题与 xperf 和 xperfview 相关,它们是 Windows Performance Toolkit 的一部分(又是 Windows SDK 7.1 的一部分)。

比较两个图表,“按线程的 CPU 采样”和“按线程的 CPU 使用率”,有几个我不明白的区别。我将使用 audiodg.exe 作为示例。

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

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

  3. CPU 采样汇总表显示每个模块/进程的重量和重量百分比。如果我加载符号,我可以深入研究 audiodg 过程。CPU 调度聚合摘要表(从 CPU 使用情况图表启动)显示 CPU 使用情况和 % CPU 使用情况——权重不可用。(相反,CPU 使用情况在 CPU 采样汇总表中不可用。)我无法深入研究 audiodg——我只看到主线程和几个 ntdll.dll 线程。

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

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

4

1 回答 1

4

Xperf 确实让这有点混乱,这是我对正在发生的事情的理解:

  • CPU 样本数据,使用 PROFILE 内核标志启用。CPU 样本数据会定期收集,并记录有关 CPU 当时正在做什么的信息(例如,样本时的进程、线程 ID 和调用堆栈。)
  • 上下文切换数据,使用 CSWITCH 内核标志启用。这记录了发生的每个上下文切换的数据(例如,谁被切换进/出和调用堆栈。)

按线程进行的 CPU 采样显示了为每个线程记录的配置文件事件的数量,这些事件在跟踪期间的某个时间间隔内汇总。例如,如果 audiodg 以 10% 的时间执行 2 秒,我们预计在那段时间内会看到大约 10% 的使用率。但是,因为这是基于采样的,所以在每个示例事件中,有可能恰好来自另一个进程的线程正在执行——换句话说,这 10% 的线程被示例事件“遗漏”了。

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

每个数据都有好处:

  • CPU 采样实际上会告诉您在采样时线程正在做什么,因为它会在线程执行期间收集调用堆栈。上下文切换信息只会告诉您何时切换线程或切换线程,而不会告诉您之间。
  • 上下文切换信息将准确地告诉您每个线程需要执行多少时间。 这个数据是正确的。当然,抽样只是概率性的。

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

希望有帮助!

于 2011-02-06T20:37:11.030 回答