w3wp / asp.net高内存使用情况 – 这是否有问题?

我们有一个安装在几个环境中的asp.net(.net 4.0)web应用程序。 在大多数环境中,内存使用量在1GB左右。 但是,我们有一个内存使用达到5.5GB的环境。 这是在一台运行VMWare esx客户端的4核和8GB RAM的Server 2008计算机上。

我build立了性能计数器,结果如下:

Memory Committed Bytes 10 145 739 948,0000 Pages Output/sec 0,0000 Paging File _Total % Usage 28,998 Process _Total w3wp Working Set 7 480 003 280 5 604 421 056 

我也采取了w3wp进程的内存转储(当它是+/- 2GB,因为更大的转储失败)。 在转储上运行DebugDiag并没有让我更聪明。 似乎.net本身只占用了800MB,大部分内存被“其他”占用。

 .NET GC Heap Information GC Heap Size 826,09 MBytes Total Commit Size 1217 MB Total Reserved Size 16190 MB Heap Analysis Summary Number of heaps 29 Heaps Total reserved memory 1,89 GBytes Total committed memory 1,79 GBytes ... (largest of the Heaps) Reserved memory 1,69 GBytes Committed memory 1,67 GBytes(99,14% of reserved) Uncommitted memory 14,86 MBytes(0,86% of reserved) Number of heap segments 113 segments Number of uncommitted ranges 113 range(s) Size of largest uncommitted range 0 Bytes 

事情是,我不确定这种高内存使用率是一个问题。 所以我在寻找的是如何解决这个问题的一些指导:

  • 无论是有人告诉我,这只是IIS7的工作原理,我不应该担心内存。
  • 或者有人指出我可以如何进一步分析这个转储(特别是我如何能够看到这个1,6GB的堆。
  • 或者向我解释为什么.net正在使用什么和W3WP正在使用什么之间有如此大的差异。

编辑:这是我在ProcExp中看到的: 在这里输入图像说明

正如你所看到的,所有堆中的总字节数是1.12GB。 当时,W3WP使用6.4GB。 为什么这两个数字之间有这么大的差距? 有什么可以占用这个空间? 这是我看到的蕙兰分裂吗?

这实际上更像是一个开发人员的问题,与IIS无关。

你应该做的第一件事是确定内存在哪一代堆(0,1,2或3(大对象堆))

Process Explorer提供了显示此信息的简单方法。

在大多数情况下,.NET GC是自我pipe理的。 有几个.config参数可以调整这个参数,但这确实是开发人员应该提供指导的一个领域。

如果你想检查堆,WinDbg可能是select的工具。

http://blogs.microsoft.co.il/sasha/2010/08/24/psscor2-object-inspection-commands-part-2/

http://blogs.microsoft.co.il/sasha/2010/08/26/psscor2-gc-heap-analysis-commands/

Process Explorer GC堆信息

对于那些最终在这里得到类似的东西的人来说:最终它是.net框架的Active Directory库中的非托pipe代码没有正确处理。 这就是为什么非托pipe堆太大了。

我怎么知道是什么罪魁祸首? 我只是结束了随机的内存地址来找出内容是什么。 而且由于我发现了很多与Active Directory相关的数据,我知道这是泄漏的数据。

稍后几个Dispose()调用,问题就解决了。