什么时候IIS 6.0应用程序池崩溃与内存问题?

我们在混合的传统ASP / .NET网站上遇到了内存不足的问题已经有一段时间了。 基本上,我们看到几个不同的情况:

  1. 一些请求(SQL查询返回一个大的logging集)发生,导致内存急剧尖峰(私人和虚拟字节),IIS工作进程崩溃,应用程序池回收。
  2. 私人字节保持“正常”,但虚拟字节处于最大值(〜2GB),IIS工作进程崩溃,应用程序池回收。

崩溃有EventID:1009,1011和1013。

在这两种情况下,ASP都会在我们的应用程序日志中报告内存不足消息

如果我们真的“内存不足”,为什么应用程序中的用户仍然可以工作,新用户甚至不能login? 这不是说没有任何要求可以提供吗?

显然,IIS仍然可以处理一些请求 – 所以答案可能是取决于具体的请求。 也许一个比另一个更“昂贵”?

无论如何,我的最终问题是 – 应用程序池在什么时候说足够了,我必须回收?

我们运行DebugDiag,看到一些超过90%甚至100%碎片的堆,所以只有当碎片高和没有更多的堆空间时,才会发生回收

这是一个稍微有些主观的问题,但是我希望能够得到一些关于这个门槛的信息!

谢谢。

除非工作进程违反了您configuration的回收标准之一(虚拟字节限制看起来像是一个好的回合标准?),或者无法回应Ping,它不会被回收。

应用程序(ISAPI)可以报告自己不健康,这会触发回收,但是这种情况发生在相当狭窄的条件下。

你的应用程序在运行时基本上是分段存储的,OOM反映了这一点 – 没有空闲的连续的 ,未分配的内存可用于新的分配; 他们失败了。

基于描述的选项是:

  • 修复分配模式

  • 将应用程序的各个部分分离成单独的应用程序池(例如,与ASP分开运行.Net) – 并非所有的应用程序都可以通过这种方式分解,但是对于那些可以轻松取胜的应用程序而言。 两个应用程序池= 2(或更多)工作进程=每个工作进程地址空间2GB

  • 实现一个虚拟的字节数限制来回收应用程序池,当它变得太大

  • 实施每日回收,以防止应用程序到达整个内存空间分散的地步

  • 如果您的应用程序是无状态的,请尝试networking园艺; 增加最大#工作进程为了避免失败更长时间

  • 在64位系统上以32位应用程序运行; 4GB提供给工作进程。

从本质上讲,如果(不pipe)堆是否变得超级碎片化,那么在那个时候你就处于一个死亡螺旋状,你需要一个新的工作进程。

IIS没有内置的安全带,所以在到达这一点之前,为您的stream程实施回收限制 – 或者只是说“忘记了,我要走64位! 可能是解决scheme。