0

我在我们的 ASP.NET 应用程序中遇到了一个问题,有时夜间回收会导致 w3wp 挂起。

这就是发生的事情:

触发回收。显然,这会在所有正在运行的线程上强制 ThreadAbortException。但是,它似乎并没有触发新的 w3wp,或者实际上是新的 w3wp 引发了异常(还没有能够重现它)。

在我的日志中,我得到了很多 ThreadAbortException,并且线程数无限增加,这意味着任何新请求都会产生一个永远不会完成的新线程。如果这将是旧的 w3wp,那么任何新请求都将被路由到新启动的 w3wp。

关闭超时和快速故障保护似乎也没有触发,导致站点在手动回收之前不可用。大多数情况下,它也会消耗大量 CPU,使服务器也几乎无法使用。

我们正在使用可能与它没有任何关系的 Monorail MVC,但是我们确实使用了他们的 RescueController 系统。如果我们在错误处理中无意中捕获了 ThreadAbortException,是否会导致无限循环导致 w3wp 严重挂起以致 IIS 无法从中恢复?

4

2 回答 2

1

由于资源限制,IIS 无法成功启动新的工作进程,这可能是由于可用内存不足。

尝试调整 IIS 中的私有内存限制,减少最大工作进程(即 Web Garden)的数量(很少将其设置为大于 1——如果它设置得高于可能需要解决的潜在问题),增加可用的物理 RAM在您的服务器上,适当地调用 Marshal.ReleaseComObject,并找出阻止释放内存的原因。您甚至可以考虑将垃圾收集模式从服务器更改为工作站(请参阅http://msdn.microsoft.com/en-us/library/ms229357.aspx)。

于 2011-08-16T01:43:32.713 回答
0

原来我们有一个异常的递归try catch循环,它捕捉到ThreadAbortException并因为继承而调用自己,所以它变成了一个无限递归。

我们有 Exception 的捕获,因为我们想要日志记录和一些错误处理,并且可能在所有其他方面都很好,除了 ThreadAbortException 将在执行期间继续抛出。

于 2011-11-22T10:26:54.423 回答