IIS应用程序池在Azure负载平衡的VM上崩溃

时间:2015-11-02 17:46:13

标签: c# asp.net azure iis kentico

我们在一对负载均衡的Azure VM上运行了一个新的ASP.NET网站。该网站相当简单,使用Kentico CMS。自上线以来的24小时内,两台Web服务器上的应用程序池突然停止了两次(相隔5-10分钟),导致503: Service unavailable错误。

查看Windows系统日志,我看到导致问题的错误:

  

应用程序池' [[NAME]]'由于a而被自动禁用   服务于该应用程序池的进程中的一系列失败。

导致这是一系列警告:

  

为应用程序池服务的流程' [[NAME]]'遭受了致命的打击   Windows进程激活服务的通信错误。该   流程ID是[[流程ID]]'。数据字段包含错误   号。

显然这是IIS的快速失败保护措施。目前尚不清楚如何找到导致这种致命通信错误的原因"。

经过一些网络搜索,我已经安装了调试诊断工具,它帮助我确定在每种情况下相关进程都是IIS工作进程(w3wp.exe)。这个工具对我来说是新手,不幸的是,自从我安装问题以来唯一一次出现问题,没有生成任何转储。但是,它的日志包含很多这样的消息:

  

第一次机会异常 - 由具有系统ID的线程引起的0xe0434352:   [[ID]]

令人沮丧的是,我不知道采取什么措施来复制错误条件。在非常相似的环境中,即使在负载测试下,UAT也从未发生过。以下是有关我的设置的一些事实:

  • 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

2 个答案:

答案 0 :(得分:3)

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

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

我可以对到达这里遇到类似问题的人说:首先,不要认为问题不在你的代码中!其次,使用Debug Diagnostcs。

答案 1 :(得分:2)

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

如果无处可去,您可以在此处找到有关警告事件的更多详细信息: IIS Application Pool Availability

关于Debug Diagnostcs工具: How to use the Debug Diagnostics tool to troubleshoot an IIS process that stops unexpectedly