Azure Batch 中的错误处理和检测

有时,可能需要在 Azure Batch 解决方案中处理任务和应用程序故障。 本文介绍不同类型的 Batch 错误,以及如何解决常见问题。

错误代码

在 Batch 中,你可能会看到几种一般类型的错误:

  • 请求从未到达 Batch 或 Batch 响应未及时到达客户端的网络故障。
  • 内部服务器错误。 这些错误有标准的 5xx 状态代码 HTTP 响应。
  • 与限制相关的错误。 这些错误包括带有 Retry-after 标头的 429503 状态代码 HTTP 响应。
  • 4xx 错误,例如 AlreadyExistsInvalidOperation。 这些错误表明资源未处于执行状态转换所需的正确状态。

若要详细了解特定错误代码,请参阅 Batch 状态和错误代码。 此参考包含 REST API、Batch 服务、作业任务和计划的错误代码。

应用程序失败

在执行期间,应用程序可能会生成诊断输出。 可以使用此输出来排查问题。 Batch 服务会将标准输出和标准错误输出发送到计算节点上任务目录中的 stdout.txt 和 stderr.txt 文件。 有关详细信息,请参阅 Batch 中的文件和目录

若要下载这些输出文件,请使用 Azure 门户或某个 Batch SDK。 例如,若要检索文件来进行故障排除,可以使用 Batch .NET 库中的 ComputeNode.GetNodeFileCloudTask.GetNodeFile

任务错误

任务错误分为多个类别。

预处理错误

如果任务无法启动,则会为任务设置预处理错误。 在以下情况下,可能会出现预处理错误:

  • 任务的资源文件已移动。
  • 存储帐户不再可用。
  • 发生了另一个问题,导致无法将文件成功复制到节点。

文件上传错误

如果为任务指定的文件由于某种原因而未能上传,则会为该任务设置文件上传错误。 在以下情况下,可能会出现文件上传错误:

  • 为访问 Azure 存储而提供的共享访问签名 (SAS) 令牌无效。
  • SAS 令牌不提供写入权限。
  • 存储帐户不再可用。
  • 发生了另一个问题,导致无法从节点成功复制文件。

应用程序错误

任务命令行指定的进程也可能会失败。 有关详细信息,请参阅任务退出代码

对于应用程序错误,请将 Batch 配置为自动重试任务最多到指定的次数。

约束错误

若要指定作业或任务的最大执行持续期间,请设置 maxWallClockTime 约束。 使用此设置可终止无法继续执行的任务。

当任务超过该最大时间时:

  • 任务被标记为“已完成”。
  • 退出代码设置为 0xC000013A
  • SchedulingError 字段被标记为 { category:"ServerError", code="TaskEnded"}

任务退出代码

当任务执行某个进程时,Batch 将使用进程的返回代码填充任务的退出代码属性。 如果进程返回非零退出代码,Batch 服务会将任务标记为“失败”。

Batch 服务不决定任务的退出代码。 由进程本身或执行进程的操作系统确定退出代码。

任务失败或中断

任务偶尔会失败或中断。 例如:

  • 任务应用程序本身可能会失败。
  • 运行任务的节点可能会重新启动。
  • 重设大小操作可能会从池中删除节点。 如果池的解除分配策略立即删除节点,而不等待任务完成,则可能会发生此操作。

在所有情况下,Batch 都可以自动将任务重新排队,以便在另一个节点上执行。

间歇性的问题也有可能会导致任务停止响应,或者花费过长时间来执行。 可为任务设置最长执行间隔。 如果任务超过该间隔,Batch 服务会中断任务应用程序。

连接到计算节点

可通过远程登录到计算节点来执行调试和故障排除。 使用 Azure 门户下载 Windows 节点的远程桌面协议 (RDP) 文件,并获取 Linux 节点的安全外壳 (SSH) 连接信息。 也可以使用 Batch .NETBatch Python API 来下载此信息。

若要通过 RDP 或 SSH 连接到某个节点,请先在该节点上创建一个用户。 使用下列方法之一:

如果需要,可以配置或禁用对计算节点的访问权限

对有问题的节点进行故障排除

Batch 客户端应用程序或服务可以检查失败任务的元数据,以识别问题节点。 池中的每个节点都有一个唯一 ID。 任务元数据包括运行该任务的节点。 找到问题节点后,请尝试以下方法来解决故障。

重新启动节点

重启节点有时会修复不明显的问题,例如进程停滞或崩溃。 如果池使用某个启动任务,或作业使用某个作业准备任务,重新启动节点将会执行这些任务。

对节点进行重置映像

对节点进行重置映像会重新安装操作系统。 在重置映像发生后,启动任务和作业准备任务会重新运行。

从池中删除节点

有时必须从池中删除节点。

对节点禁用任务计划

对节点禁用任务计划实际上会使节点脱机。 Batch 不会向节点分配任何进一步的任务。 但是,节点将继续在池中运行。 然后,可以在不丢失失败任务数据的情况下进一步调查失败。 该节点也不会导致更多的任务失败。

例如,对节点禁用任务计划。 然后,远程登录到该节点。 检查事件日志,并执行其他故障排除措施。 解决问题后,再次启用任务计划以使节点重新联机。

可以使用这些操作指定 Batch 处理节点上当前正在运行的任务。 例如,使用 Batch .NET API 禁用任务计划时,可以为 DisableComputeNodeSchedulingOption 指定枚举值。 你可以选择:

  • 终止正在运行的任务:Terminate
  • 将任务重新排队以在其他节点上进行计划:Requeue
  • 允许正在运行的任务在执行操作之前完成:TaskCompletion

出错后重试

Batch API 会将有关故障的信息通知你。 你可以使用内置的全局重试处理程序重试所有 API。 使用此选项是最佳做法。

发生故障后,请等待几秒钟,然后重试。 如果重试的次数过多或速度过快,重试处理程序会限制请求。

后续步骤