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

PerfView: Analyzing Performance of App including Database Calls

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

发现

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

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

感谢您的帮助!

编辑:

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

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

所以,我成功了。

我错过的(Vance Morrison 实际上在他的视频教程中对此进行了解释)是:当使用 perfview 进行挂钟时间分析时,您会从 "waiting around" 中的所有线程中获得累积时间什么叫做"BLOCKED_TIME"。这意味着在 70 秒的时间里,单独的终结器线程为此 "BLOCKED_TIME" 添加了 70 秒,因为它坐在那里没有做任何事情(至少在我的情况下几乎没有任何事情)。

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

我发现最有用的是在我自己的代码中搜索 "seemed time consuming" 的方法,我切换到此方法的调用方视图。这从它被调用的地方以及在被调用者中查看是什么导致了堆栈进一步消耗时间(存储库中的数据库调用或获取一些数据的服务调用)。

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

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

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