1

在调查在 Asp.Net 4.0 上运行的网站上的性能问题时需要建议。

网站上的一点背景

该网站是一个建立在电子商务框架上的网上商店,已在许多项目中证明了自己的稳定性和可靠性。Webshop 已经稳定运行了很长一段时间(一年),但是在客户将他们的 ERP(MS Dynamics NAV)升级到更高版本后,性能问题很快就开始上升。

问题本身:

应用程序池正常启动,但会消耗几乎所有可用内存。所以,显然这是一个内存泄漏的情况。

更具体的例子:昨晚重新启动应用程序池,使用的内存约为 500 兆字节。在大约 16-18 小时内,该池已经以大约 2 GB 的速度运行。池将继续增长,直到几乎所有内存都被消耗并且应用程序变得非常缓慢。

应用程序池的内存快照是在池重新启动后和 2 Gig 时使用PerfView拍摄的。
快照的差异附在下面: 堆快照在 500Mb 和 2Gb 之间存在差异

如您所见,第一行是mscrolib!LocalDataStoreHolder。如果我尝试打开有关它的详细信息,我可以看到以下引用来源视图,如下所示: LocalDataStoreHolder 上的引用视图 问题是 - 我无法打开这些节点中的任何一个以获取更详细的信息。所以目前我无法弄清楚,是什么吞噬了记忆。
如果它可能有任何帮助,下面是 RefTree 屏幕截图。在这里,您可以看到强句柄占 92.2%。 参考树视图

所以问题是 - 任何人都可以提供任何关于如何深入细节的提示或想法吗?如何找出导致内存泄漏的原因?

先感谢您

编辑:我还尝试了 RedGate ANTS 内存配置文件,这在此处的各种线程中得到了很多建议。这是我拍摄了一些内存快照后的摘要图片,最新的一张在 20 小时后完成,应用程序池占用了大约 3.7 Gb 的 RAM。如您所见,左侧巨大的红色块是“Unmanaged”,大小为 2.5 Gb。正如 ANTS 所说,这要么被 CLR 本身用完,要么被图形数据用完,要么被通过 P/Invoke 或 COM+ 访问的非托管数据。不过,不知道如何获得更深入的细节。 在此处输入图像描述

4

1 回答 1

1

PerfView 无法恢复 64 位应用程序的堆栈(您可以在原始文档中找到它)。可能您的应用程序是 64 位应用程序。如果可能 - 尝试重新编译并以 32 位执行。

于 2013-04-11T11:25:13.623 回答