问题描述
我很难确定我们的应用程序在哪里花费了时间。
查看来自采样和精确 cpu 使用率的 ETW 跟踪的火焰图,它们相互矛盾。以下是 1 秒持续时间的图表
根据“cpu使用率(采样)”图表
-
vbscript.dll!COleScript::ParseScriptText
是整体表现的重要贡献者。 -
ws2_32.dll!recv
是一个小贡献者。
根据“cpu使用率(精确)”图表
从本质上讲,这表明情况正好相反?
-
vbscript.dll!COleScript::ParseScriptText
是一个小贡献者,仅占用 3.95 毫秒的 cpu。 -
ws2_32.dll!recv
贡献很大,占用了 915,09 毫秒的 cpu。
我遗漏或误解了什么?
cpu 使用率(采样)
cpu 使用率(精确)
解决方法
有一个简单的解释:
CPU 使用率(精确)基于上下文切换数据,因此它可以非常准确地衡量线程在 CPU 上花费的时间 - 它运行的时间。然而,因为它基于上下文切换数据,所以它只知道当线程打开/关闭 CPU 时调用堆栈是什么。它不知道中间在做什么。因此,CPU 使用率(精确)数据知道线程使用了多少时间,但不知道时间花在了哪里。
CPU 使用率(采样)在一个线程消耗的 CPU 时间方面不太准确,但它非常好(从统计上讲,没有系统偏差)告诉您时间花在哪里。
对于 CPU 使用率(采样),您仍然需要注意包含时间与独占时间(在函数中花费的时间与在其后代中花费的时间),以便正确解释数据,但听起来数据正是您想要的。
有关详细信息,请参阅 https://randomascii.wordpress.com/2015/09/24/etw-central/,其中包含这两个表的所有列的文档,以及使用它们的案例研究(一个用于调查 CPU 使用情况,另一个用于调查 CPU 空闲情况)