我有一个 Winforms 应用程序,它通常占用大约 2-4% 的 CPU。我们在有限的时间内看到了高达 27% 的 CPU 峰值。什么是最好的分析工具来确定究竟是什么导致了这个峰值。我们使用 dottrace,但我不知道如何将其准确映射到 CPU 峰值?
感谢帮助
我有一个 Winforms 应用程序,它通常占用大约 2-4% 的 CPU。我们在有限的时间内看到了高达 27% 的 CPU 峰值。什么是最好的分析工具来确定究竟是什么导致了这个峰值。我们使用 dottrace,但我不知道如何将其准确映射到 CPU 峰值?
感谢帮助
我之前使用过 2 个分析工具 - RedGate 的 ANTS 分析器,以及 Visual Studio Team System 中的内置分析器。
自从我使用 RedGate 的 ( http://www.red-gate.com/products/ants_profiler/index.htm ) 分析器已经有一段时间了,尽管我最近使用了 Visual Studio 2008 中的内置工具。
话虽如此,我觉得 RedGate 产品使用起来更直观。当我使用 RedGate 产品时,让我感到沮丧的一件事是,我无法指示分析器仅从某个点开始分析我的代码 - 我遇到了性能损失,直到有相当数量的代码才达到已经执行,因此污染了我的结果。从那时起,他们可能已经添加了该功能。
Visual Studio 的内置版本仅在其非常高端的产品版本中可用。如果我错了,请有人纠正我,但我认为即使是“专业”版本也没有分析器。我目前正在使用 Team System Developer Edition,它确实具有代码分析工具。
VS 版本确实做的一件事是让您暂停分析,甚至在暂停分析的情况下启动您的应用程序,这样您就可以真正专注于非常具体的事情的性能。当您试图理解分析结果时,这会非常有用。
编辑:这两个工具都会显示内存使用情况,特定方法被调用的次数,以及每个方法花费了多少时间。据我所知,他们不做的是向您显示任何给定时间点的 CPU 使用情况。但是,CPU 使用率和在给定代码块中花费的时间之间可能存在很强的相关性。
如果您可以通过在 APP 中调用某些操作来持续复制 CPU 峰值,那么我要做的就是尝试使用 VS 分析器,在分析暂停的情况下启动应用程序,在您执行任何通常会导致的操作之前启用分析尖峰,并检查这些结果。
这当然假设您有某种确定性行为来重新创建尖峰。如果不是……您可能会考虑将线程进程或垃圾收集作为您的性能影响的候选者。
我发现 Compuware http://www.compuware.com/的 DevPartner 是一个出色的分析工具。不幸的是,目前他们似乎不支持 VS 2008。
另外,这个峰值真的令人担忧吗?你在什么样的硬件上看到了这个?在四核 CPU 上飙升至 27% 可能会令人担忧,但在 800Mhz P3 上则不会。
它会保持多长时间?@Matt有一个很好的观点,即垃圾收集可能有问题。或者可能交换到磁盘。
它是长时间影响整体系统性能,还是时不时地影响几秒钟?
并不是说找到解决方案不应该被关注,但它有多重要?
您还可以使用 Sysinternal Process Explorer 和 Perfmon 了解有关您的应用程序的很多信息(就像 GC 上出现峰值一样)。
如果您的应用程序是单线程的,那么最好的分析工具就是您的 IDE。
补充:也许这很明显,但是百分比 CPU 使用率并不是一个很明确的概念。当你的程序完全运行时,它是 100%。如果不是,则为 0%。因此,部分百分比必须基于某种随时间推移的平滑积分。但是,无论它是什么,您都会看到一个峰值。一些分析器可让您了解这样的峰值并仅分析该间隔。
Xperf/Xperfview 工具是向您显示尖峰并允许您深入了解导致它的原因的最佳工具。
查看 http://msdn.microsoft.com/en-us/performance/cc825801.aspx
和 http://msdn.microsoft.com/en-us/library/cc305221.aspx
这些工具基于 ETW 技术(Windows 事件跟踪),它可以让您超级准确地了解您的流程和整个系统正在发生的事情。
这些工具还允许您捕获跟踪以进行事后分析,以及附加/分离功能。希望这可以帮助。