0

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

查看来自采样的 ETW 跟踪的火焰图和精确的 CPU 使用情况,它们相互矛盾。以下是 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 使用率(采样)


CPU 使用率(精确)

CPU 使用率(精确)

4

1 回答 1

2

有一个简单的解释:

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

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

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

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

于 2021-03-24T03:49:02.343 回答