【问题标题】:w3wp occasionally hangs on nightly recyclew3wp 偶尔会挂起每晚回收
【发布时间】:2011-07-28 09:27:43
【问题描述】:

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

会发生这样的事情:

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

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

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

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

【问题讨论】:

  • 可能要确保您正在记录所有回收事件。来自 powershell:set-webconfigurationproperty /system.applicationHost/applicationPools/applicationPoolDefaults/recycling -name:logEventOnRecycle -value:"Time, Requests, Schedule, Memory, IsapiUnhealthy, OnDemand, ConfigChange, PrivateMemory"

标签: asp.net iis-7.5 castle-monorail w3wp threadabortexception


【解决方案1】:

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

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

【讨论】:

  • 非常感谢您的意见。我们没有使用网络花园,所以这应该不是问题。有限的内存分配听起来很合理,我会调查一下。关于服务器垃圾收集模式,不知道有两种不同的模式。这是一台双四核机器(共 8 台),但它运行多个站点。两种模式的优缺点是什么?听起来并发垃圾回收是件好事?
  • 在进入切换垃圾回收模式之前,请确保并分析您的应用程序以更好地描述您所看到的问题。运行性能监视器 ("%windir%\system32\perfmon.msc /s"),阅读本文以帮助了解要查看的性能计数器。 CLRProfiler (msdn.microsoft.com/en-us/library/ff650691.aspx) 等工具可能会有所帮助。如果证据继续指向内存和垃圾收集,请参阅此操作系统线程:stackoverflow.com/questions/4931309/…
  • 我的主要问题是只有在生产环境中我才注意到这种行为,并且我无权访问这些服务器。查看我们为服务器提供的内存图,我看不到在回收期间可用内存有任何直接下降,尽管它们以 5 分钟的间隔进行监控。但是,在手动重启完成之前,服务器通常会关闭大约 30 分钟,因此在此期间它应该非常低,根据图表我仍然有大约 3GB 可用(16GB 中)
  • 您可以让操作人员附加一个可以捕获 .dmp 文件和异常日志的调试器。如果您的应用程序的表现不是太差,那么开销可能是可以接受的(从 CPU 的 5% 到 30%)。请参阅我发布的问题(并回答了我自己 tee hee!)stackoverflow.com/questions/6618105/…,也许它也会对您有所帮助。
【解决方案2】:

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

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

【讨论】:

  • 当时是什么?
  • @JasonCoyne 我认为我们还没有深入了解它。我们做了一些启动优化以减轻我们看到的启动负载,并最终切换到 Win2012,这可能会有所改善。
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2023-03-23
  • 1970-01-01
  • 1970-01-01
  • 2014-07-15
  • 2012-01-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多