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

jul*_*gon 11 iis profiling memory-management overhead

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

在此输入图像描述

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

在使用dotMemory玩弄后,我决定尝试另一种工具,并从RedGate中找到有关ANTS Memory Profiler的信息.

在此输入图像描述

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

在此输入图像描述

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

从图中可以看出,单独的CLR似乎只占用了80MB的内存.我们如何降低IIS应用程序池的内存使用量?我已经读过将池更改为x86模式确实减少了大量的内存开销并尝试了几分钟,导致一些好的减少到几乎总ram的一半,但即使我这样做我也喜欢要知道为什么这些简单的项目在IIS上吃了这么多内存.

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

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