IIS应用程序池在Azure负载平衡虚拟机上崩溃

问题描述:

我们有一个新的ASP.NET网站在一对负载平衡的Azure虚拟机上运行。该网站非常简单,并使用Kentico CMS。自上线后24小时内两次,两台Web服务器上的应用程序池突然停止(相距5-10分钟),导致出现503: Service unavailable错误。IIS应用程序池在Azure负载平衡虚拟机上崩溃

了解Windows系统日志我看到这导致问题的错误:

应用程序池“[NAME]”被自动由于在这个过程中 一系列的失败(ES)禁用提供该应用程序池。

领导到这是一系列的警告:

服务应用程序池的处理“[[NAME]遇到致命的 通信错误与Windows进程激活服务。进程ID为 为'[[PROCESS ID]]'。数据字段包含错误号码 。

显然,这是IIS在踢快速失败保护。什么是不明确的是如何找到这个“致命通信错误”的原因。

经过一些网络搜索后,我已经安装了调试诊断工具,它帮助我识别出在任何情况下相关进程都是IIS工作进程(w3wp.exe)。这个工具对我来说是新的,但不幸的是,自从我安装它以来发生问题的唯一时间,没有生成垃圾箱。然而,它的日志中含有大量的消息是这样的:

第一次机会异常 - 0xe0434352造成线程系统ID: [ID]

令人沮丧的事情是,我不不知道要采取哪些步骤来复制错误条件。即使在负载测试下,它也不会出现在非常相似的环境中。以下是关于我的设置的一些事实:

  • ASP.NET版本=与身份设置为域帐户上的网站目录
  • 应用设置,最大一个修改权限运行4.5.2
  • 应用程序池工作进程

任何意见非常赞赏。

*更新1 *

我现在有DebugDiag资料转储由 “致命的通信错误” 警告事件发生。转储总结如下:

Dump Summary 
------------ 
Process Name: w3wp.exe : C:\Windows\SysWOW64\inetsrv\w3wp.exe 
Process Architecture: x86 
Exception Code: 0xC00000FD 
Exception Information: The thread used up its stack. 
Heap Information: Present 
+0

如果有任何记录错误,您可以检查Kentico事件日志吗? –

+0

Kentico的事件日志中唯一的错误是由自定义Web部件中的Response.Redirect导致的“线程被中止”异常。将此方法的重载的endResponse参数设置为false会停止它抛出异常。上述主要错误并没有重新发生,因为这是固定的,但“致命的通信错误”警告已经提出了几次,所以我认为这不是原因。 – getsetcode

在我的跟踪,这归因于错误结束我的代码。在非常边缘的情况下,CMS返回一个空的Guid而不是实际的ID,导致递归方法中的堆栈溢出。

我上面发布的0xC00000FD异常代码实际上是一个堆栈溢出异常,所以一旦我知道并下载了Debug Diagnostcs转储文件,我就能够在本地复制崩溃场景。顺便说一句,这个工具非常强大,并且能够证明崩溃的确切条件。

我可以对那些到达这里有类似问题的人说 - 首先,不要认为问题不在您的代码中!其次,使用调试诊断程序。

首先,什么是你的应用程序池定期回收的时间间隔设置&在IIS重叠设置? - 如果在计划回收并禁用重叠时发生这些事件,则会发生此行为。即使启用了重叠功能,我也猜测它与应用程序池的自动回收有些关联,因为两个实例在同一时间都受到cca的影响&它每天发生两次,并且可能导致记录您提到的警告(Here you might find how to disable logging this warning in case it is caused by automatic recycling

如果走不通,你可以找到有关警告事件在这里更多的细节: IIS Application Pool Availability

约在调试Diagnostcs工具在这里: How to use the Debug Diagnostics tool to troubleshoot an IIS process that stops unexpectedly

+0

应用程序池每1740分钟回收一次,设置为重叠。不符合问题。正如我所说,它似乎是导致应用程序池快速失败保护功能的“致命通信错误”的常见现象。我现在有由此事件生成的DebugDialog转储,因此如果有任何问题,我会报告回来线索。 – getsetcode