4

我目前正在使用 PerfView 对我的 (C#) 应用程序进行性能分析。但通常这些应用程序使用大量的数据库调用。所以我问自己这样的问题: - 在存储库中花费了多少时间?- (等待 SQL 查询返回花费了多少时间?) -> 我不知道这是否可以通过 PerfView 发现

但从我的痕迹中,我几乎没有得到任何有用的结果。在“任何堆栈”视图中,它告诉我(当我在我的存储库上使用分组时)在我的存储库中花费了 1.5 秒(整个调用大约为 45 秒)。而且我知道这不是真的,因为存储库调用了数据库很多。

是否只是在等待 SQL 查询完成时没有捕获 CPU 指标,因为在这段时间内 CPU 无事可做,因此我的时间只包括存储库中的数据转换时间等?

谢谢你的帮助!

编辑:

我错过的是打开线程时间选项以获取阻塞代码的时间(我想这是在数据库调用期间发生的事情)。我现在得到了所有的堆栈,只是过滤掉了无趣的东西。但我似乎无处可去。

当使用“线程时间”时,对我来说特别有趣的是 BLOCKED_TIME。但有了它,我认为时间已经过去了。当您查看屏幕截图时,它告诉我 CPU_TIME 是 28,384。这是毫秒(afaik),但 BLOCKED_TIME 是 2,314,732,不能是毫秒。所以 CPU_TIME 的百分比非常低,只有 1.2%,但 70 秒中有 28 秒仍然很多。所以包容百分比时间在这里比较苹果和橙子。有人可以解释一下吗?

性能视图

4

1 回答 1

5

所以,我成功了。

我错过的(实际上 Vance Morrison 在他的视频教程中解释过)是:当使用 perfview 进行挂钟时间分析时,您会从所有一直在“等待”的线程中获得累积时间,即所谓的“BLOCKED_TIME” . 这意味着在 70 秒的时间内,单独的终结器线程将 70 秒添加到这个“BLOCKED_TIME”,因为它坐在那里没有做任何事情(至少在我的情况下几乎任何事情)。

因此,在进行挂钟时间分析时,重要的是要过滤掉您感兴趣的内容。例如,搜索占用 CPU 时间最多的线程,然后将其包含在您的分析中,然后深入堆栈以找到昂贵的代码片段(也可能导致数据库或服务调用)。一旦您从方法的角度进行分析,您就会真正了解在该方法中花费的时间,而累积的“BLOCK_TIME”不在图片中。

我发现最有用的是在我自己的代码中搜索“看起来很耗时”的方法,我切换到了这个方法的调用者视图。这揭示了它的调用位置和被调用者视图是什么导致了堆栈中进一步消耗时间的原因(存储库中的数据库调用或用于获取一些数据的服务调用)。

有点难以解释,但一旦我真正了解了挂钟时间分析的基础知识,这一切在某种程度上都是有意义的。

我推荐这个视频教程:http ://channel9.msdn.com/Series/PerfView-Tutorial

再次,伟大而强大的工具!

于 2015-02-27T15:13:27.263 回答