IIS内存pipe理和阈值可能泄漏

我们正在运行一些X64的Win Server 2012的Web服务器(所以IIS 8)。

我们注意到盒子上的空闲内存始终保持5-10%的空闲空间。 实际上,我们在这些框上运行了很多应用程序(13个网站,超过13个应用程序池的80个应用程序)。 大部分代码都是为每个站点重复的,因为它们对应于不同的数据库和物理站点,但应用程序是相同的。

我们非常有信心,随着内存的不断增长,我们在应用程序中出现了内存泄漏,所以我们直截了当地看待这个问题,但是我感到困惑的是IIS的内存分配和pipe理。 我想知道,如果它是IIS 8或x64服务器(我们刚刚移动到最近x64)的任何不同。

所以基本上我们的每个networking服务器都有6GB的内存,并且会占用5-10%的空闲内存。 我们确信的顶级应用泄漏是使用高达1.2GB的内存。 下一个是大约800MB,其余的平均为大约400-500MB(所有这些值是私人内存,在任务pipe理器中看到)正如我所说的代码是重复的,所以如果有一个网站泄漏,将在所有的他们只是不同的物理位置可以有一些function打开或closures,这说明了很大的差异。

当我们解决这个问题的时候,我们决定去记忆,所以我们不会遇到问题。 所以昨天晚上,我把每台服务器放下,把内存翻了一番,达到了12GB。 今天早上,3台服务器占用内存的77%,80%和82%。 所有的进程都增加了1.5-2倍的内存使用量。

所以现在我很困惑。 这真的是内存泄漏吗? 还是有某种内存预分配? 还是从来没有释放内存,除非另一个进程请求它一个SQL Server或什么?

当内存翻倍时,如果内存水平突然变得如此巨大,那么在6GB的内存水平上呢? 有没有定下的门槛? IIS / ASP是不是垃圾收集,直到内存不足或什么?

任何答案表示赞赏。

别担心! 你可能只是过度caching!

IIS中的默认输出cachingconfiguration可启用内核模式和用户模式caching。

内核模式caching是由本地HTTP驱动程序(又名http.sys)pipe理的,并且闪电般快,但只能提供“公共”内容,因为它需要能够在请求到达之前响应caching命中Web应用程序。
不幸的是,这意味着许多请求types不能在内核模式下被caching,包括授权会话(比如访问需要authentication的网站)。

你所描述的设置的types听起来像某种多租户客户端服务,导致我相信内核模式caching不在图片中。

另一方面,用户模式caching在应用程序级进行pipe理,caching对象存储在服务工作进程的内存集中。 总高速caching大小由system.webServer/Cachingconfiguration元素上名为maxCacheSize的属性控制。

默认情况下, maxCacheSize属性设置为0 ,这大致转换为让IIS分配尽可能多的内存

如果你有很多连续的小(<256kb)命中,但uricaching命中率很低,IIS肯定会吃掉你提供的所有内存。

您可以通过降低maxCacheSize值或完全禁用服务器上的输出caching来轻松testing这是否为真。


如果您仍然确信自己的应用程序存在内存问题,请启动性能监视器并查看“ASP.NET应用程序”性能计数器对象。
selectGC计数器并查看垃圾收集是如何分散的。

Gen0的收集应该代表几乎所有的处置,而大量的Gen1和Gen2的收集可能表明一个问题,比对象的生命周期长 – 这是内存pipe理失败的一个常见症状