排查无法启动的 Azure 云服务(外延支持)角色实例的问题

本文介绍如何排查 Azure 云服务(扩展支持)角色实例中的启动失败。

故障排除清单

从以下选项中进行选择,诊断角色实例中出现的问题。

选项 1:关闭自定义错误

若要查看完整的错误信息,请打开 Web 角色的 Web.config 文件,将自定义错误模式设置为 Off,然后重新部署服务:

  1. 在 Visual Studio 中打开解决方案。

  2. 在解决方案资源管理器中,打开 Web.config 文件。

  3. 在本 system.web 部分中,添加以下 XML 代码:

    <customErrors mode="Off" />
    
  4. 保存文件。

  5. 重新打包并重新部署服务。

重新部署服务后,你可能会收到有关该服务的错误消息将包括缺少的程序集或 DLL 的名称。

选项 2:使用 PowerShell 查看角色实例状态

若要获取有关角色实例的运行时状态的信息,请运行 Get-AzCloudServiceRoleInstanceView cmdlet:

$roleInstanceView = @{
    CloudServiceName = "<cloud-service-name>"
    ResourceGroupName = "<resource-group-name>"
    RoleInstanceName = "WebRole1_IN_0"
}
Get-AzCloudServiceRoleInstanceView @roleInstanceView

角色实例的状态列在第一列中,如以下示例输出中所示:

Statuses            PlatformFaultDomain PlatformUpdateDomain
--------            ------------------- --------------------
{RoleStateStarting} 0                   0

选项 3:使用Azure 门户查看角色实例状态

若要查看有关Azure 门户中角色实例的状态信息,请执行以下步骤:

  1. Azure 门户中,搜索并选择云服务(扩展支持)。

  2. 在云服务列表中,选择云服务的名称。

  3. 在菜单窗格中,在“设置”查看,然后选择“角色和实例”。

  4. 选择角色实例的名称。

  5. 在角色实例窗格中,记下“状态”字段中角色实例的状态。

选项 4:使用远程桌面查看错误信息

若要访问角色并查看完整的错误信息,请执行以下步骤,使用远程桌面协议 (RDP):

  1. 为 Azure 云服务(外延支持)添加远程桌面扩展

  2. Azure 门户中,当云服务实例显示就绪状态时,使用远程桌面登录到云服务。 有关详细信息,请参阅使用远程桌面连接到角色实例

  3. 使用用于设置远程桌面的凭据登录到虚拟机(VM)。

  4. 打开命令提示符窗口

  5. 运行 ipconfig 命令。 复制 IPv4 地址的返回值。

  6. 打开 Web 浏览器。

  7. 在地址栏中,粘贴 IPv4 地址,然后追加斜杠和 Web 应用程序默认文件的名称。 例如,http://<ipv4-address>/default.aspx

如果现在转到该网站,你将看到包含详细信息的错误消息。 下面是一个示例:

“/”应用程序中的服务器错误。

无法加载文件或程序集“Microsoft.WindowsAzure.StorageClient,Version=1.1.0.0,Culture=neutral,PublicKeyToken=<16-digit-hexadecimal-string>”或其依赖项之一。 系统找不到指定的文件。

说明: 执行当前 Web 请求期间发生未经处理的异常。 请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。

异常详细信息: System.IO.FileNotFoundException

选项 5:使用计算模拟器

可以使用 Azure 计算模拟器诊断和排查缺少的依赖项和 Web.config 错误的问题。 若要获得最佳结果,请使用此方法诊断问题,请使用安装 Windows 的计算机或 VM。

使用 Azure 计算模拟器诊断问题:

  1. 安装 Azure SDK

  2. 在开发计算机上生成云服务项目。

  3. 在文件资源管理器的云服务项目中,转到 bin\debug 文件夹。

  4. 将 .csx 文件夹和 .cscfg 文件复制到用来调试问题的计算机。

  5. 在干净计算机上,打开 Azure SDK 命令提示符 窗口。

  6. 在命令提示符处运行以下命令 csrun

    csrun.exe /devstore:start
    
  7. 运行下面的命令:

    run csrun <path-to-.csx-folder> <path-to-.cscfg-file> /launchBrowser
    

    角色启动时,Web 浏览器会显示详细的错误信息。

如果需要更多诊断,可以使用标准的 Windows 故障排除工具。

选项 6:使用 IntelliTrace

注意

无法在 Visual Studio 2022 中使用 IntelliTrace。 如果使用 Visual Studio 2019、2017 或 2015,IntelliTrace 仍可用。

对于使用 .NET Framework 4 的辅助角色和 Web 角色,可以使用 IntelliTrace。 Visual Studio Enterprise 中提供了 IntelliTrace。

在启用 IntelliTrace 时部署云服务:

  1. 验证是否已 安装 Azure SDK 1.3 或更高版本。

  2. 在 Visual Studio 中部署解决方案。 设置部署时,选中“为 .NET 4 角色启用 IntelliTrace”复选框。

  3. 角色实例启动后,打开“服务器资源管理器”。

  4. 展开“Azure\云服务”节点。

  5. 若要列出角色实例,请展开部署。 然后,右键单击角色实例。

  6. 选择“查看 IntelliTrace 日志”

  7. IntelliTrace 摘要中,转到 “异常数据 ”并展开该节点。

  8. 在异常列表中,查找包含 System.IO.FileNotFoundException 的 Type 列值的。 相应的 消息 列值应类似于以下文本:

    无法加载文件或程序集“Microsoft.WindowsAzure.StorageClient,Version=1.1.0.0,Culture=neutral,PublicKeyToken=<16-digit-hexadecimal-string>”或其依赖项之一。 系统找不到指定的文件。

原因 1:由于 RoleInstanceStartupTimeoutError,云服务操作失败

Azure 云服务(扩展支持)中的一个或多个角色实例启动速度可能很慢。 或者,你的角色实例可能正在回收或停滞在忙碌状态,但未按预期启动。 在这种情况下, RoleInstanceStartupTimeoutError 将显示角色应用程序错误消息。

角色应用程序包含可能导致角色回收的两个部分:

如果角色停止,平台即服务 (PaaS) 代理将重新启动角色。

要确定问题是否由启动任务引起,请执行以下步骤:

  1. 尝试使用远程桌面连接到有问题的角色实例。

  2. 连接到角色实例后,选择“开始”,然后搜索并选择“任务管理器”。

  3. 要查看进程列表,请选择“任务管理器”中的“详细信息”选项卡。

  4. 检查是否有WaIISHost.exe (适用于 WebRole)或WaWorkerHost.exe(对于 WorkerRole)的进程。 如果这两类进程都缺失,启动任务可能会失败。

能否验证问题是否是由启动任务引起的? 如果是,可应用以下解决方案。 但是,仅当启动任务是简单或前台任务时,解决方案才可用。 该解决方案不适用于后台启动任务。 在角色启动的同时,这些任务将以异步方式运行。

解决方案:调试启动任务脚本

要排查启动任务失败问题,请调试在 VM 启动期间运行的脚本。 此启动任务脚本是 Startup.cmd 文件。 要帮助调查脚本中的问题,可从以下选项中选择:

  • 查看 C:\Resources\WaHostBootstrapper.log 日志文件。 此文件是WaHostBootstrapper.exe进程的日志。 此进程负责启动任务。 Windows Azure 经典 VM 体系结构的工作流中对此进行了介绍。 然后,搜索涉及运行 Startup.cmd的任何错误或异常。 请特别验证退出代码是否为 0。 如果不是,则启动任务已完成,但存在错误。 如果没有与脚本的退出代码相关的日志,则启动任务仍在运行。

  • 如果启动任务脚本由于预期的业务影响而无法在生产环境中自由运行,请在命令行中自定义日志记录机制。 例如,可将脚本命令中的重要信息的输出重定向到文件。 执行此操作的一种方法是追加 > "%TEMP%\StartupLog.txt" 到命令末尾。

  • 在命令行中,手动运行启动任务脚本。 下表显示了 WebRole 或 WorkerRole 角色的此脚本的位置。

    角色 脚本位置
    WebRole E:\approot\bin\Startup.cmd
    WorkerRole E:\approot\Startup.cmd

原因 2:DLL 或程序集缺失

无响应的角色实例和在状态之间循环的角色实例可能是由缺少 DLL 或程序集引起的。

下面是 DLL 或程序集缺失的一些症状:

  • 角色实例循环访问 “正在初始化”、“ 忙碌”和 “正在停止 ”状态。

  • 角色实例已移动到 “就绪 ”状态,但页面在 Web 应用程序中不可见。

如果网站部署在 Web 角色中,但缺少 DLL,它可能会显示以下服务器运行时错误消息。

“/”应用程序中的服务器错误。

运行时错误

说明: 服务器上发生应用程序错误。 此应用程序的当前自定义错误设置阻止远程查看应用程序错误的详细信息(出于安全原因)。 但可以通过在本地服务器计算机上运行的浏览器查看。

详细信息:若要启用远程计算机上可查看此特定错误消息的详细信息,请使用位于当前 Web 应用程序的根目录中的“web.config”配置文件创建标记<customErrors>。 然后,此<customErrors>标记应将其“mode”属性设置为“”。Off

解决方案:解决缺少的 DLL 和程序集

若要解决 DLL 和程序集缺失的问题,请执行以下操作:

  1. 在 Visual Studio 中打开解决方案。

  2. 在“解决方案资源管理器”中,打开 References 文件夹。

  3. 选择错误消息中标识的程序集。

  4. 在“属性”中,将“复制本地”属性设置为“True”

  5. 重新部署云服务。

验证并确认错误不再显示后,重新部署服务。 设置部署时,不要选中“为 .NET 4 角色启用 IntelliTrace”复选框。

后续步骤

详细信息

有关经典云服务中启动任务的初始配置、执行和示例的信息,请参阅以下文章:

联系我们寻求帮助

如果你有任何疑问或需要帮助,请创建支持请求联系 Azure 社区支持。 你还可以将产品反馈提交到 Azure 反馈社区