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

cma*_*art 4 .net c# performance profiling perfview

我目前正在使用 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 秒仍然很多。所以包容百分比时间在这里比较苹果和橙子。有人可以解释一下吗?

对 WCF 服务调用进行大约 70 秒分析后的 PerfView“线程时间堆栈”视图

cma*_*art 5

所以,我成功了。

我错过的(万斯莫里森实际上在他的视频教程中解释了这一点)是:当使用 perfview 进行挂钟时间分析时,您会从所有“等待”的线程中获得累积时间,称为“BLOCKED_TIME” . 这意味着有 70 秒的时间,单独的终结器线程为此“BLOCKED_TIME”增加了 70 秒,因为它坐在那里什么也没做(至少在我的情况下几乎没有任何事情)。

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

我发现最有用的是在我自己的代码中搜索“似乎很耗时”的方法,我切换到此方法的调用者视图。这从它被调用的位置以及在被调用者中查看是什么导致堆栈进一步消耗时间(存储库中的数据库调用或获取一些数据的服务调用)提供了一些启示。

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

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

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