这个问题与Xperf和Xperfview有关,即Windows Performance Toolkit的一部分(反过来又是Windows SDK 7.1的一部分)。

比较两个图表:“通过线程采样”和“线程的CPU使用”,我不明白有几个差异。我将以audiodg.exe为例。

  1. 在螺纹下拉中,CPU采样图上只有一个线程。 CPU使用图显示了几个Audiodg线程。

  2. 这两个图的Y轴标记为“使用%使用”,但测量值不同。通常,在CPU采样图上,给定线程的%使用率比CPU使用图表较低。

  3. CPU采样摘要表显示了每个模块/过程的重量和%重量。如果我加载符号,我可以深入挖掘Audiodg过程。 CPU调度汇总摘要表(从CPU使用图启动)显示CPU使用率和%CPU使用 - 不可用。 (相反,CPU采样摘要表不可用CPU使用。)我无法深入到Audiodg - 我只看到主线程和几个ntdll.dll螺纹。

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

所以我的问题...这里使用CPU使用的可靠度量是什么? CPU的使用数不是从CPU样品中得出的吗?这些数字不应该以某种方式关联吗?

有帮助吗?

解决方案

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

  • CPU示例数据,使用配置文件内核标志启用。 CPU样本数据是按一些常规间隔收集的,并记录有关CPU当时正在做什么的信息(例如,在样本时的过程,线程ID和Callstack)。
  • 上下文开关数据,使用cswitch内核标志启用。这记录了有关发生的每个上下文开关的数据(例如,谁被切换/输出和呼叫箱。)。

通过线程采样CPU 显示了每个线程记录的配置文件事件的数量,这些事件在轨迹持续时间内在某个时间间隔内汇总。例如,如果奥多格(Audiodg)在2秒内执行10%的时间,我们希望在那段时间看到约10%的“使用”。但是,由于这是基于采样的,因此在每个示例事件中,来自另一个过程的线程恰好是执行的 - 换句话说,示例事件“错过”了10%。

线程使用CPU 使用上下文开关数据计算。 “用法”是上下文切换到以后的上下文之间的时间(当然,此数据在某些小间隔上进行了汇总)。

每个数据都有好处:

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

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

希望有帮助!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top