2

我们在 Azure 的 .NET 4.0 中运行了一个相当大且复杂的 MVC3 项目。

我们遇到的症状是网站变得无响应然后崩溃。当我们进入管理门户时,所有实例都处于“已停止”状态。

据我了解,这是 IIS 快速故障保护启动并终止应用程序池而不重新启动它的行为。

我已经使用调试诊断工具为我的云服务中的 IIS 实例捕获内存转储,并且每次崩溃时,最后的消息是:

[4/2/2014 1:41:52 AM] First chance exception - 0X000006B5 caused by thread with System     
ID: 2856.  DetailID = 3
Script Error
Error Code - 0x800A01CE
Error Source [Microsoft VBScript runtime error]
Error Description [The remote server machine does not exist or is unavailable: 'ServiceState']
Line 104, Column 2

或者

[4/2/2014 12:25:52 AM] First chance exception - 0XE06D7363 caused by thread with System ID: 3292Script Error
Error Code - 0x80070013
Error Source [Unavailable]
Error Description [Unavailable]
Line 1103, Column 4

此外,我得到的这些异常的数量与我的应用程序池中定义的最大故障数量非常相似,如果不相同的话。

我尝试过的事情:

  • 在 Azure 模拟器和 VM 上运行,它不会崩溃
  • 升级到 Azure SDK 2.2 并部署到 OS Family 4(当前运行 SDK 2.0,OS Fam:3)
  • 关闭自定义错误
  • 使用 Application_Error() 捕获所有错误

对我来说,似乎有一些异常没有被捕获并且正在使 IIS 工作进程崩溃,一旦它达到 5(我的应用程序池中的最大故障)它就会崩溃。

如果有人能对此有所了解或提出其他我可以尝试的建议,我将不胜感激。

4

2 回答 2

1

您还可以在 statup 任务中配置快速故障保护,在 power shell 脚本中使用类似这样的内容

($env:windir + "\system32\inetsrv\appcmd.exe set config /section:system.applicationHost/applicationPools /applicationPoolDefaults.failure.rapidFailProtectionInterval:'00:03:00'  /commit:apphost") | Invoke-Expression

($env:windir + "\system32\inetsrv\appcmd.exe set config /section:system.applicationHost/applicationPools /applicationPoolDefaults.failure.rapidFailProtectionMaxCrashes:'15'  /commit:apphost") | Invoke-Expression
于 2014-04-02T07:38:28.577 回答
1

您收到的错误 (0x80070013) 通常定义为“媒体被写保护”。(尽管自定义组件可能会抛出 HResult 以获得完全不同的东西)。您通过收集 DebugDiag 转储所采取的方法是正确的,但不是仅在崩溃时进行转储,而是将 DebugDiag 配置为在类型 0XE06D7363 的第一次机会异常时写入转储。当您的应用程序抛出该错误时,这将为您提供转储,然后在 WinDBG 中打开转储并转储调用堆栈应该很简单。

根据您的应用程序崩溃的频率,您可能还需要运行 procmon 以查看您正在访问的资源可能会抛出“媒体被写保护”。错误。

另请注意,您可以使用AzureTools将这些不同的调试工具快速安装到 VM 上。

于 2014-04-02T15:07:35.437 回答