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

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

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

如何获取数据:

perfmon perfmon是你的朋友。 您可以查看很多计数器(系统范围以及特定于流程)。 所以你可以从分析大4(那个内存,磁盘使用,cpu和网络)开始。 关于哪些计数器是最好的,有很多post ,所以我不会在这里详细介绍perf计数器。

windbg如果你确实看到记忆力正在增长并且没有被收集,那么就该引进大枪了。 .NET非常适合从开发人员那里抽象内存使用,但这意味着我们必须在.NET下面找到不允许垃圾收集器完成其工作的内容。 带有sos.dll (托管扩展)的windbg是一个很棒的工具。 windbg中最困难的部分(根据我的经验)只是正确加载了sos扩展。 您必须密切关注要分析的目标体系结构(64或32)以及正在运行的CLR版本。

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

sos自v2以来,sos.dll随.NET Framework一起提供。 使用v4,Visual Studio 2010集成了sos并允许您分析.dmp文件!

我发现最有用的内存泄漏的sos命令是:

!eeheap -gc (每个堆的每一代中的内容概述)

!dumpheap -min (转储所有对象和类型,超过特定的

!dumpheap -type (转出特定所有对象)

!gcroot

(打印出一个堆栈,这样你就可以看到GC中的父对象固定了什么)

!do

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

其他一些指示:

通常,您希望在负载下快照内存,因此最好有一些方法来模拟系统外部的内存。 因此,最好提前运行,甚至将其用于应用程序的QA流程。

对于性能问题,通常最好使用正在运行的应用程序随时间拍摄常规快照。 然后,您可以在分析时比较快照。

嗯,这比我想要的要长一点,但希望值得!

您必须检查调度程序应用程序的内存使用情况……似乎您没有处理未使用的对象。