PerfView:分析应用程序的性能,包括数据库调用

时间:2015-02-25 10:48:37

标签: c# .net performance profiling perfview

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

但是从我的踪迹中我几乎没有任何有用的结果。在" Any Stacks"查看它告诉我(当我在我的存储库中使用分组时)在我的Repsoitory中花费了1.5秒(整个调用大约是45秒)。我知道这不是真的,因为存储库调用数据库很多。

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

感谢您的帮助!

编辑:

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

使用"线程时间"对我来说特别有趣。是BLOCKED_TIME。但随着时间的推移我想起来了。当你看截图时,它告诉我CPU_TIME是28,384。这是毫秒(afaik),但BLOCKED_TIME是2,314,732,不能是毫秒。因此CPU_TIME的百分比非常低,为1.2%,但70秒中的28个仍然很多。所以包容百分比时间是在这里比较苹果和橘子。有人可以解释一下吗?

PerfView "Thread Time Stacks" View after about 70 seconds analysis of a WCF service call

1 个答案:

答案 0 :(得分:4)

所以,我成功了。

我错过了(Vance Morrison实际上在他的视频教程中对此进行了解释)是:当使用perfview进行挂钟时间分析时,您可以从所有已经“等待”的线程中获得累积的时间“BLOCKED_TIME”。这意味着在70秒的时间内,终结者线程为这个“BLOCKED_TIME”增加了70秒,因为它坐在那里没有做任何事情(至少在我的情况下几乎任何事情)。

因此,在进行挂钟时间分析时,过滤掉您感兴趣的内容非常重要。例如,搜索占用CPU时间最多的线程,并在分析中包含此线程并进一步向下用于查找代码昂贵的代码(也可能导致数据库或服务调用)。一旦你从一个方法的角度进行分析,你真的得到了在这个方法中花费的时间,并且积累的“BLOCK_TIME”就不在了。

我发现最有用的是在我自己的代码中搜索“看起来很耗时”的方法,我切换到此方法的调用者视图。从调用它的位置和调用者的角度来看,是什么导致了进一步向下的消耗时间(存储库或服务中的数据库调用需要获取一些数据)。

有点难以解释,但是一旦我真正了解了挂钟时间分析的基础知识,那么在某些时候这一切都是有道理的。

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

再次,伟大且非常强大的工具!