长时间运行的应用程序变慢

问题描述:

有一个应用程序由三个可执行文件组成。其中之一 - 调度员,运行其他可执行文件。调度程序在完成时从可执行文件接收代码。也就是说,只有分派器总是在运行,其他可执行程序会卸载并重新加载。该应用程序在服务点上运行并全天候工作。第一次启动时,应用程序运行速度很快。在一天结束时,应用程序工作非常缓慢。可能是这种行为的原因是什么?长时间运行的应用程序变慢

+0

重复订阅相同的事件会这样做。只要你不使用调试器,这只是一个猜测练习。 – 2012-02-25 13:45:39

随着时间推移,可能会有很多原因导致减速。从缓慢的内存泄漏到防病毒。你可以做的最好的尝试是建立证据(数据)有关哪个区域的应用程序首先看。尽量不要与许多开发者谈论它,因为每个人都会对可能出现的错误有不同的看法。获取数据!

如何获得数据:

perfmon perfmon的是你的朋友。您可以查看很多计数器(系统范围以及特定流程)。所以你可以开始分析大4(内存,磁盘使用情况,CPU和网络)。在那里有一个lot of posts关于什么柜台是最好的,所以我不会在这里详细介绍性能计数器。

windbg 如果你确实看到记忆正在增长,而没有被收集,那么是时候引进大枪。 .NET非常擅长从开发人员那里抽象出内存使用情况,但这意味着我们必须在.NET下面找出不允许垃圾收集器执行其工作的内容。 windbgsos.dll(托管扩展)是一个很好的工具。 windbg中最难的部分(以我的经验)只是让sos扩展程序正确加载。您必须密切关注您正在分析的目标体系结构(64或32)以及您正在运行的CLR版本。

procdump sysinternals的procdump是一个伟大的小工具,可以从正在运行的进程中获取内存快照。这些快照(.dmp文件)可以通过windbg进行分析。

sos 自v2以来,sos.dll已经与.NET Framework一起提供。借助v4,Visual Studio 2010集成了sos并允许您分析.dmp文件!我发现最有用的内存泄漏

的SOS命令:!

eeheap -gc

(什么是每个堆的每一代概述)dumpheap -min <size>(转储出所有对象和类型,在特定<size>

!dumpheap型<type>(dump出来一个SPE的所有对象cific <type>

!!gcroot <address>(打印出栈,所以你可以看到什么父对象在GC寄托)

<address>(打印出特定对象的内存)

其他一些指针:

通常情况下,您希望在负载下快照内存,因此有一些方法可以从系统外部进行模拟。因此,提前运行它并将其应用到应用程序的质量保证过程中是一件好事。

对于性能问题,通常最好随着时间的推移使用正在运行的应用程序定期拍摄快照。然后,您可以比较分析时的快照。嗯,这比我想要的要长一点,但希望值得!

+0

真棒答案。我会补充一点,我的第一个选择工具就是配置任务管理器并观察资源分配的动态。 – kenny 2012-02-25 14:40:36

+0

但是,如果exe被终止,资源如何被释放? EXE通过Application.Exit(int)终止它自己。调度器只是一个最上面的窗口。没有可能导致内存泄漏的东西(我猜)。 – EngineerSpock 2012-02-26 14:31:43

+0

@EngineerSpock然后,首先测量系统级资源(CPU,内存,磁盘和网络)。接下来,找出哪个进程导致其中一个进程出现峰值。优化搜索并重新开始。这需要时间,但要坚持下去,你会找到原因。 – 2012-02-26 16:41:28

你必须检查你的调度器应用的内存使用情况......看来你是不处置未使用的对象。