2011-04-11 56 views
3

是否有任何.NET性能分析工具可以附加到正在运行的Windows服务并进行基本堆栈调用采样?如果该工具不需要安装,那将是非常好的,因为我需要通过客户的IT部门获取大量繁文tape节。.NET生产代码性能分析工具

谢谢


自然的性能问题: 这个程序有性能问题运行作为Windows服务,并处理来自200多个移动设备的收入信息。通常这个程序每秒可以处理至少10条消息。不幸的是,在最近的升级之后,由于某些原因,该程序通常在上午7点左右不能够快速处理消息。消息进入后,它可以在程序内部队列中超过10分钟,然后才能进行处理。我们还注意到该程序使用的CPU比正常高。通常情况下,它应该是8核心机器的5%,现在是20-25%。

该程序不仅处理传入消息,还维护数据库并向客户端提供数据。它有五个线程处理传入的消息,并在其线程上运行任何维护作业。

当前的解决方法是在发生减速时重新启动服务。重新启动后,程序将再次正常运行(CPU低于5%)。直到凌晨7点左右,第二天早上才会发生。每次重新启动后,队列中的所有消息均被丢弃。通常上午7点和下午5点是我们收到大量信息的时间,但问题似乎只发生在上午7点。

我们的团队试图在内部使用模拟消息重现该程序,并进行代码比较以查看是否存在任何关键瓶颈。

+0

听起来像问题可能与内存泄漏有关(可能是一个事件句柄未释放,导致对象永远无法被垃圾收集)。我会建议在内部运行诸如DebugDiag之类的测试消息,并查看是否存在某种性质的泄漏。你可以检查[这个链接](http://viisual.net/tools/)下载1.2测试版,它有一个专门针对.Net内存使用情况的规则。抛出你的PDB文件,你可以得到分配的行号。 – pstrjds 2011-04-11 04:51:44

+0

感谢您的建议。应用程序可能会在一段时间内积累某些内容,并且不会丢弃数据,因为我们注意到应用程序启动后内存更高。但是,它并不直接解释高于正常的CPU使用率。 – dsum 2011-04-11 20:40:56

+0

不知道你的代码的性质我不能肯定地说,但是如果由于内存压力它必须进行大量分页,或者你正在迭代代码中的某种集合,那么CPU使用率可能会增加,预计会不断增长,但现在每当数据进入时你都被迫迭代更大的集合......这肯定会导致CPU时间随着时间的推移而增长。 – pstrjds 2011-04-12 15:38:44

回答

0

感谢您的所有建议。

我尝试了一些性能分析工具,但是它们都需要安装,而且有些需要花钱。

尝试使用“Windows Debug Tools”+“Process Explorer”+“Process Monitor”查看是否可以获取正在运行线程的堆栈跟踪的快照。不幸的是不能让我们自己的托管符号文件(pdb)工作。我可以看到所有对内核api的调用,但没有我自己的代码。

幸运的是,我们的客户已经批准我们安装探查器。如果您获得了Visual Studio Premium或Enterprise版本,它将附带stand alone profiler。我能够在客户端计算机上获取配置文件报告并使用Visual Studio分析报告。

+0

如果将pdb-s的位置添加到进程资源管理器符号路径配置中,则应该在其线程视图中显示路径。 – Ghita 2015-08-05 14:01:41

1

看看AVICode(最近被微软收购)是否符合您的需求。该产品都是关于监控生产环境中应用程序的性能。我在10年内没有看过这个产品,但是当我看到它之前,它强调了从生产中运行的应用程序获取异常信息和调用堆栈的能力,而且开销很小。它建立在.NET性能分析API的基础之上,所以如果它提供了CPU利用率情况的功能,我也不会感到惊讶。我不知道在服务器上安装/启用它所需的详细信息,因此我不确定它是否可以轻松清除IT部门的障碍。

也检查出performance counters for the .NET Framework,可以启用它,而无需触摸您的应用程序或其配置。

2

我不知道任何可以使用而无需安装它们的分析器,因此您可能最终必须与客户的IT部门达成一些协议。

但是,您可以通过查看.NET性能计数器来获得一些洞察。由于某种原因,服务可能会过度垃圾回收。

如果这样不能产生任何线索,可以使用SysInternals中的Process Explorer。无需事先安装即可运行。属性窗口有一个线程,它将向您显示进程中的所有线程以及它们的运行时间,这可能会有所帮助。