你当前正在访问 Microsoft Azure Global Edition 技术文档网站。 如果需要访问由世纪互联运营的 Microsoft Azure 中国技术文档网站,请访问 https://docs.azure.cn。
Azure Batch 中的错误处理和检测
有时,可能需要在 Azure Batch 解决方案中处理任务和应用程序故障。 本文介绍不同类型的 Batch 错误,以及如何解决常见问题。
错误代码
在 Batch 中,你可能会看到几种一般类型的错误:
- 请求从未到达 Batch 或 Batch 响应未及时到达客户端的网络故障。
- 内部服务器错误。 这些错误有标准的
5xx
状态代码 HTTP 响应。 - 与限制相关的错误。 这些错误包括带有
Retry-after
标头的429
或503
状态代码 HTTP 响应。 -
4xx
错误,例如AlreadyExists
和InvalidOperation
。 这些错误表明资源未处于执行状态转换所需的正确状态。
若要详细了解特定错误代码,请参阅 Batch 状态和错误代码。 此参考包含 REST API、Batch 服务、作业任务和计划的错误代码。
应用程序失败
在执行期间,应用程序可能会生成诊断输出。 可以使用此输出来排查问题。 Batch 服务会将标准输出和标准错误输出发送到计算节点上任务目录中的 stdout.txt 和 stderr.txt 文件。 有关详细信息,请参阅 Batch 中的文件和目录。
若要下载这些输出文件,请使用 Azure 门户或某个 Batch SDK。 例如,若要检索文件来进行故障排除,可以使用 Batch .NET 库中的 ComputeNode.GetNodeFile 和 CloudTask.GetNodeFile。
任务错误
任务错误分为多个类别。
预处理错误
如果任务无法启动,则会为任务设置预处理错误。 在以下情况下,可能会出现预处理错误:
- 任务的资源文件已移动。
- 存储帐户不再可用。
- 发生了另一个问题,导致无法将文件成功复制到节点。
文件上传错误
如果为任务指定的文件由于某种原因而未能上传,则会为该任务设置文件上传错误。 在以下情况下,可能会出现文件上传错误:
- 为访问 Azure 存储而提供的共享访问签名 (SAS) 令牌无效。
- SAS 令牌不提供写入权限。
- 存储帐户不再可用。
- 发生了另一个问题,导致无法从节点成功复制文件。
应用程序错误
任务命令行指定的进程也可能会失败。 有关详细信息,请参阅任务退出代码。
对于应用程序错误,请将 Batch 配置为自动重试任务最多到指定的次数。
约束错误
若要指定作业或任务的最大执行持续期间,请设置 maxWallClockTime
约束。 使用此设置可终止无法继续执行的任务。
当任务超过该最大时间时:
- 任务被标记为“已完成”。
- 退出代码设置为
0xC000013A
。 -
SchedulingError 字段被标记为
{ category:"ServerError", code="TaskEnded"}
。
任务退出代码
当任务执行某个进程时,Batch 将使用进程的返回代码填充任务的退出代码属性。 如果进程返回非零退出代码,Batch 服务会将任务标记为“失败”。
Batch 服务不决定任务的退出代码。 由进程本身或执行进程的操作系统确定退出代码。
任务失败或中断
任务偶尔会失败或中断。 例如:
- 任务应用程序本身可能会失败。
- 运行任务的节点可能会重新启动。
- 重设大小操作可能会从池中删除节点。 如果池的解除分配策略立即删除节点,而不等待任务完成,则可能会发生此操作。
在所有情况下,Batch 都可以自动将任务重新排队,以便在另一个节点上执行。
间歇性的问题也有可能会导致任务停止响应,或者花费过长时间来执行。 可为任务设置最长执行间隔。 如果任务超过该间隔,Batch 服务会中断任务应用程序。
连接到计算节点
可通过远程登录到计算节点来执行调试和故障排除。 使用 Azure 门户下载 Windows 节点的远程桌面协议 (RDP) 文件,并获取 Linux 节点的安全外壳 (SSH) 连接信息。 也可以使用 Batch .NET 或 Batch Python API 来下载此信息。
若要通过 RDP 或 SSH 连接到某个节点,请先在该节点上创建一个用户。 使用下列方法之一:
- Azure 门户
- Batch REST API:adduser
- Batch .NET API:ComputeNode.CreateComputeNodeUser
- Batch Python 模块:add_user
如果需要,可以配置或禁用对计算节点的访问权限。
对有问题的节点进行故障排除
Batch 客户端应用程序或服务可以检查失败任务的元数据,以识别问题节点。 池中的每个节点都有一个唯一 ID。 任务元数据包括运行该任务的节点。 找到问题节点后,请尝试以下方法来解决故障。
重新启动节点
重启节点有时会修复不明显的问题,例如进程停滞或崩溃。 如果池使用某个启动任务,或作业使用某个作业准备任务,重新启动节点将会执行这些任务。
- Batch REST API:reboot
- Batch .NET API:ComputeNode.Reboot
对节点进行重置映像
对节点进行重置映像会重新安装操作系统。 在重置映像发生后,启动任务和作业准备任务会重新运行。
- Batch REST API:reimage
- Batch .NET API:ComputeNode.Reimage
从池中删除节点
有时必须从池中删除节点。
- Batch REST API:removenodes
- Batch .NET API:PoolOperations
对节点禁用任务计划
对节点禁用任务计划实际上会使节点脱机。 Batch 不会向节点分配任何进一步的任务。 但是,节点将继续在池中运行。 然后,可以在不丢失失败任务数据的情况下进一步调查失败。 该节点也不会导致更多的任务失败。
例如,对节点禁用任务计划。 然后,远程登录到该节点。 检查事件日志,并执行其他故障排除措施。 解决问题后,再次启用任务计划以使节点重新联机。
- Batch REST API:enablescheduling
- Batch .NET API:ComputeNode.EnableScheduling
可以使用这些操作指定 Batch 处理节点上当前正在运行的任务。 例如,使用 Batch .NET API 禁用任务计划时,可以为 DisableComputeNodeSchedulingOption 指定枚举值。 你可以选择:
- 终止正在运行的任务:
Terminate
- 将任务重新排队以在其他节点上进行计划:
Requeue
- 允许正在运行的任务在执行操作之前完成:
TaskCompletion
出错后重试
Batch API 会将有关故障的信息通知你。 你可以使用内置的全局重试处理程序重试所有 API。 使用此选项是最佳做法。
发生故障后,请等待几秒钟,然后重试。 如果重试的次数过多或速度过快,重试处理程序会限制请求。