当 ETW 图相互矛盾时,如何解释它们的简单和精确 CPU 用法

How to interprete ETW graphs for sampled and precise CPU usage when they contradict

我很难确定我们的应用程序将时间花在哪里。

查看采样的 ETW 跟踪的火焰图和精确的 CPU 用法,它们相互矛盾。以下是持续时间为 1 秒的图表

根据"CPU Usage (Sampled)"图表

  1. vbscript.dll!COleScript::ParseScriptText 是总绩效的 贡献者。
  2. ws2_32.dll!recv是小贡献者。

根据"CPU Usage (Precise)"图表

从本质上讲,这表明它是相反的?

  1. vbscript.dll!COleScript::ParseScriptText 是一个 贡献者,仅占用 3.95 毫秒的 CPU.
  2. ws2_32.dll!recv 是一个很大的贡献者,占用了 CPU.
  3. 的 915,09 毫秒

我遗漏了什么或误解了什么?


CPU 用法(采样)


CPU 用法(精确)

有一个简单的解释:

CPU Usage (Precise) 基于上下文切换数据,因此它可以非常准确地衡量线程在 -CPU 上花费了多少时间 - 运行。然而,因为它基于上下文切换数据,所以它只知道线程进入 on/off CPU 时调用堆栈是什么。它不知道自己在做什么。因此,CPU 使用(精确)数据知道一个线程使用了多少多少 时间,但它不知道哪里 花费了时间.

CPU Usage (Sampled) 在线程消耗多少 CPU 时间方面不太准确,但它很好(从统计学上讲,没有系统偏差)告诉你时间在哪里花完了。

使用 CPU Usage (Sampled) 你仍然需要注意包含时间和独占时间(花在一个函数上的时间和花在它的后代上的时间)以便正确解释数据,但它听起来像那个数据是你想要的

有关详细信息,请参阅 https://randomascii.wordpress.com/2015/09/24/etw-central/,其中包含这两个表的所有列的文档,以及使用它们的案例研究(一个用于调查 CPU 使用场景,另一个调查 CPU 个闲置场景)