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

标签 c# asp.net azure iis kentico

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

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

Application pool '[[NAME]]' is being automatically disabled due to a series of failures in the process(es) serving that application pool.

在此之前出现了一系列警告:

A process serving application pool '[[NAME]]' suffered a fatal communication error with the Windows Process Activation Service. The process id was '[[PROCESS ID]]'. The data field contains the error number.

显然,这是 IIS 的快速失败保护启动的结果。目前尚不清楚如何找到此“致命通信错误”的原因。

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

First chance exception - 0xe0434352 caused by thread with System ID: [[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

最佳答案

最后我发现这是我代码中的一个错误。在非常极端的情况下,CMS 返回空 Guid 而不是实际 ID,这会导致递归方法中的堆栈溢出。

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

我能对遇到类似问题的人说的是 - 首先,不要假设问题不在于您的代码!其次,使用调试诊断。

关于c# - IIS 应用程序池在 Azure 负载平衡 VM 上崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33483709/

相关文章:

c# - 我们可以使用应用程序洞察来进行集中日志记录吗?

Azure Runbook - 在上下文中找不到订阅

c# - 记录C#程序的执行路径?

c# - 如何理解这个任务需要什么

javascript - 脚本代码不在 foreach 循环内运行?

azure - AuthorizationFailed - 在 Azure 中创建角色分配

azure - K8S 提供 kubeconfig 作为字节数组 genericclioptions

c# - Entity Framework 隐式类型转换

c# - 发送的电子邮件仍然包含 HTML 标签。

html - 将 TD 扩展到最大可用宽度