我在我们的ASP.NET应用程序中遇到了一个问题,有时夜间回收会导致w3wp挂起。
这就是发生的事情:
循环被触发。显然,这会在所有正在运行的线程上强制使用ThreadAbortException。但是,它似乎不会触发新的w3wp,或者是新的w3wp真正抛出了异常(目前还不能重现它)。
在我的日志中,我得到了大量的ThreadAbortException,线程数无限地增加,这意味着任何新的请求都会产生一个永远不会结束的新线程。如果这是旧的w3wp,则任何新请求都将被路由到新启动的w3wp。
无论是关闭超时还是快速故障保护似乎都不会触发,这使得saite在手动回收之前不可用。大多数情况下,它还会占用大量CPU,使服务器几乎无法使用。
我们使用的是Monorail MVC,这可能与它没有任何关系,但是我们确实使用了他们的RescueController系统。如果我们在错误处理中无意中捕获了ThreadAbortException,会不会导致无限循环,导致w3wp严重挂起,以至于IIS无法恢复?
发布于 2011-08-16 09:43:33
由于资源限制,IIS无法成功启动新的工作进程,可能是由于可用内存不足。
尝试调整IIS中的私有内存限制,减少最大工作进程数(也称为Web Garden )(很少将其设置为大于1--如果设置得大于1,则可能存在潜在问题需要解决),增加服务器上可用的物理内存,适当调用Marshal.ReleaseComObject,或者找出阻止内存释放的原因。您甚至可以考虑将垃圾收集模式从服务器更改为工作站(请参阅http://msdn.microsoft.com/en-us/library/ms229357.aspx)。
发布于 2011-11-22 18:26:54
事实证明,我们有一个递归的try catch循环用于异常,它捕获ThreadAbortException并由于继承而调用自身,因此它变成了无限递归。
我们捕获异常是因为我们想要日志记录和一些错误处理,而且可能在所有其他方面都没问题,除了ThreadAbortException在执行过程中会继续抛出异常。
https://stackoverflow.com/questions/6856771
复制相似问题