如何解释 ETW 图以获取采样和精确的 CPU 使用率,当它们矛盾时

问题描述

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

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

根据“cpu使用率(采样)”图表

  1. vbscript.dll!COleScript::ParseScriptText 是整体表现的重要贡献者。
  2. ws2_32.dll!recv一个小贡献者。

根据“cpu使用率(精确)”图表

从本质上讲,这表明情况正好相反?

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

我遗漏或误解了什么?


cpu 使用率(采样)

CPU Usage (Sampled)


cpu 使用率(精确)

CPU Usage (Precise)

解决方法

有一个简单的解释:

CPU 使用率(精确)基于上下文切换数据,因此它可以非常准确地衡量线程在 CPU 上花费的时间 - 它运行的时间。然而,因为它基于上下文切换数据,所以它只知道当线程打开/关闭 CPU 时调用堆栈是什么。它不知道中间在做什么。因此,CPU 使用率(精确)数据知道线程使用了多少时间,但不知道时间花在了哪里

CPU 使用率(采样)在一个线程消耗的 CPU 时间方面不太准确,但它非常好(从统计上讲,没有系统偏差)告诉您时间花在哪里。

对于 CPU 使用率(采样),您仍然需要注意包含时间与独占时间(在函数中花费的时间与在其后代中花费的时间),以便正确解释数据,但听起来数据正是您想要的。

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