我遇到过我们的ASP.NET应用程序的问题,偶尔每晚都会回收w3wp挂起的情况。
这就是:
触发回收。显然,这会强制所有正在运行的线程上的ThreadAbortException。但是,它似乎没有触发新的w3wp,或者是新的w3wp实际上抛出了异常(还没有能够重现它)。
在我的日志中,我得到了很多ThreadAbortException,并且线程数无限期地上升和下降,这意味着任何新请求都会产生一个永不完成的新线程。如果这是旧w3wp,任何新请求都将路由到新启动的w3wp。
关闭超时和快速失败保护似乎也没有触发,在手动回收之前,saite不可用。大多数情况下,它也消耗了大量CPU,使服务器几乎无法使用。
我们正在使用Monorail MVC,它可能与它没有任何关系,但我们确实使用了他们的RescueController系统。如果我们在错误处理中无意中捕获ThreadAbortException,是否会导致无限循环导致w3wp严重挂起以至于IIS无法从中恢复?
答案 0 :(得分:1)
由于资源限制,IIS无法成功启动新的工作进程,可能是由于可用内存不足。
尝试调整IIS中的私有内存限制,减少最大工作进程数(即Web Garden)(很少将其设置为大于1 - 如果设置得高于可能存在潜在问题的话),增加您的服务器上可用的物理RAM,适当地调用Marshal.ReleaseComObject,以及排除阻止释放内存的内容。您甚至可以考虑将垃圾收集模式从服务器更改为工作站(请参阅http://msdn.microsoft.com/en-us/library/ms229357.aspx)。
答案 1 :(得分:0)
事实证明,我们有一个Exception的递归try catch循环,它捕获ThreadAbortException并因为继承而调用自身,因此它变成了一个无限递归。
我们有异常的catch,因为我们想要记录和一些错误处理,并且除了ThreadAbortException将在执行期间继续抛出外,在所有其他方面可能都没问题。