IIS应用程序池中的大量非托管内存。这是正常的吗?

时间:2015-05-14 21:43:25

标签: iis memory-management profiling overhead

我们试图找出为什么我们在IIS中托管的应用程序耗尽了我们虚拟机上的所有RAM,为此,我下载了一些内存分析工具来进行实验。我第一次试过JetBrains' dotMemory,但很快发现应用程序池进程中的大部分内存都是非托管的,并且dotMemory不是非常有用,因为它主要处理托管内存分析。

enter image description here

请注意,池总共使用了221MB,但只管理了19MB .Net内存。

在使用dotMemory进行游戏后,我决定尝试另一种工具,并从RedGate中找到有关ANTS Memory Profiler的信息。

enter image description here

ANTS在应用程序中注入了一些消耗了大量内存的东西,但它仍然显示了一些荒谬的物理内存:

enter image description here

对于一个非常简单的WebAPI项目,这是否可以接受?我们开始注意到我们的虚拟机在几个托管项目中占用了95%到100%的内存,这导致机器速度非常慢。我们尝试统一同一应用程序池中的所有4个应用程序,但这只产生了几乎相同的结果:单个池的总内存使用量与所有4个分离的应用程序的内存使用量相匹配。

从图表中可以看出,单独的CLR似乎只占用了80MB的内存。我们如何降低IIS应用程序池的内存使用量?我已经读过changing the pools to x86 mode does reduce a lot of the memory overhead并尝试了几分钟,导致一些好的减少到几乎一半的公羊,但即使我这样做,我也想知道为什么这么简单IIS上的项目占用了大量内存。

我们正在使用一个仅具有1.7GB RAM的基本Azure虚拟机,运行这4个非常简单的Web应用程序(两个MVC网站和两个WebAPI项目)已经在运行虚拟机。

由于某些奇怪的原因,在我们的本地开发计算机上,池似乎也使用较少量的RAM。此外,似乎根本没有任何内存泄漏,因为在随机点拍摄快照总会产生相同的非常高但是恒定的内存使用量。我们非常小心地处理一次性物品的代码,并且我们使用FxCop最严格的设置,没有问题。

0 个答案:

没有答案