Azure Batch 池和节点错误

注意

本文引用了 CentOS,这是一个接近生命周期结束 (EOL) 状态的 Linux 发行版。 请相应地考虑你的使用和规划。 有关详细信息,请参阅 CentOS 生命周期结束指导

某些 Azure Batch 池创建和管理操作会立即发生。 很容易检测这类操作是否失败,因为错误通常立即从 API、命令行或用户界面返回。 但是,某些操作是异步的,并且在后台运行,需要几分钟才能完成。 本文介绍了检测和避免池和节点发生后台操作失败的方法。

确保将应用程序设置为实施全面错误检查,尤其是对于异步操作。 全面错误检查可以帮助你快速识别和诊断问题。

池错误

池错误可能与重设大小超时或失败、自动缩放失败或池删除失败有关。

调整大小超时或失败

创建新池或重设现有池大小时,需要指定目标节点数。 创建或重设大小操作会立即完成,但新节点的实际分配或现有节点的删除操作可能需要几分钟才能完成。 可以在池 - 添加池 - 重设大小 API 中指定重设大小超时。 如果在重设大小超时期间,Batch 无法获取目标节点数,则池将进入稳定状态并报告重设大小错误。

resizeError 属性会列出最近评估时发生的错误。

调整大小错误的常见原因包括:

  • 重设大小超时过短。 通常,15 分钟的默认超时时间足以分配或删除池节点。 如果要分配大量节点,例如从 Azure 市场映像分配超过 1,000 个节点,或者从自定义虚拟机 (VM) 映像分配超过 300 个节点,则可以将重设大小超时设置为 30 分钟。

  • 核心配额不足。 Batch 帐户可在所有池中分配的核心数受到限制,并会在达到该配额后停止分配节点。 可以增加核心配额,使 Batch 可以分配更多节点。 有关详细信息,请参阅 Batch 服务的配额和限制

  • 当池位于虚拟网络时,子网 IP 不足。 虚拟网络子网必须具有足够的 IP 地址才能分配给每个请求的池节点。 否则,无法创建节点。 有关详细信息,请参阅在虚拟网络中创建 Azure Batch 池

  • 当池位于虚拟网络时,资源不足。 在虚拟网络中创建池时,建议在与批处理帐户相同的订阅中创建资源(例如负载均衡器、公共 IP 和网络安全组)。 请确保这些资源的订阅配额足够。

  • 具有自定义 VM 映像的大型池。 使用自定义 VM 映像的大型池可能需要更长的时间进行分配,并且可能发生重设大小超时。 有关限制和配置的建议,请参阅使用 Azure Compute Gallery 创建池

自动缩放失败

可以将 Azure Batch 设置为自动缩放池中的节点数,并为池的自动缩放公式定义参数。 Batch 服务会使用公式定期评估池中的节点数,并设置新的目标数。 有关详细信息,请参阅创建用于缩放 Batch 池中计算节点的自动公式

使用自动缩放时,可能会出现以下问题:

  • 自动缩放评估失败。
  • 生成的重设大小操作失败并超时。
  • 自动缩放公式导致节点目标值不正确的问题。 重设大小可能会起作用或超时。

要获取关于最近一次自动缩放评估的信息,可使用 autoScaleRun 属性。 此属性报告评估时间、值和结果以及任何性能错误。

池重设大小完成事件捕获所有评估的相关信息。

池删除失败

若要删除包含节点的池,Batch 将先删除节点,这可能需要几分钟才能完成。 之后,Batch 会删除池对象对沈。

Batch 会在删除过程中将 poolState 设置为 deleting。 调用应用程序可以使用 statestateTransitionTime 属性来检测池删除时间是否过长。

如果池删除所用的时间超过预期,则 Batch 将定期重试,直到成功删除池。 在某些情况下,延迟是由 Azure 服务中断或其他暂时性问题导致的。 阻止池成功删除的其他因素可能要求你采取措施来更正问题。 这些因素可能包括以下问题:

  • Batch 创建的资源或 Batch 使用的网络资源上可能设置了资源锁。

  • 你创建的资源可能依赖于 Batch 创建的资源。 例如,如果你在虚拟网络中创建池,则 Batch 会创建网络安全组 (NSG)、公共 IP 地址和负载均衡器。 如果在池外部使用这些资源,则无法删除该池。

  • Microsoft.Batch 资源提供程序可能已从包含池的订阅中注销。

  • 对于用户订阅模式 Batch 帐户,Azure Batch 可能不再拥有包含池的订阅的参与者所有者角色。 有关详细信息,请参阅允许 Batch 访问订阅

节点错误

即使 Batch 成功分配池中的节点时,各种问题也可能会导致某些节点运行状况不佳且无法运行任务。 这些节点仍会产生费用,因此,请务必检测问题,以免为不能使用的节点付费。 了解常见的节点错误以及当前 jobState 也有助于排除故障。

开始任务失败

可以为池指定可选的 startTask。 与任何任务一样,启动任务也使用命令行,并且可以从存储下载资源文件。 启动任务在节点启动时针对每个节点运行。 waitForSuccess 属性指定 Batch 是否等待启动任务成功完成后才计划节点的任何任务。 如果将节点配置为等待启动任务成功完成,但启动任务失败,则节点不可用,但仍会产生费用。

可以使用顶级 startTaskInformation 节点属性的 taskExecutionResulttaskFailureInformation 属性来检测启动任务是否失败。

如果将 waitForSuccess 设置为 true,则失败的启动任务还会导致 Batch 将 computeNodeState 设置为 starttaskfailed

与任何任务一样,开始任务失败可能有许多原因。 若要进行故障排除,请检查 stdoutstderr 和任何其他特定于任务的日志文件。

启动任务必须可重入,因为它可能会在同一个节点上运行多次;例如,重置节点映像或重新启动节点时。 在极少数情况下,当启动任务在事件导致节点重启后运行时,一个操作系统 (OS) 或临时磁盘会重置映像,而另一个操作系统则不会。 由于 Batch 启动任务和所有 Batch 任务都从临时磁盘运行,因此这种情况通常不是问题。 但是,如果启动任务将应用程序安装到 OS 磁盘,并将其他数据保留在临时磁盘上,则可能存在同步问题。 如果同时使用这两个磁盘,请采取相应措施保护应用程序。

应用程序包下载失败

可以为池指定一个或多个应用程序包。 Batch 将指定的包文件下载到每个节点,并在节点启动之后,计划任务之前解压缩文件。 例如,通常将启动任务命令与应用程序包结合使用,以便将文件复制到另一个位置或运行安装程序。

如果应用程序包无法下载和解压缩,则 computeNodeError 属性将报告失败,并将节点状态设置为 unusable

容器下载失败

你可以在池上指定一个或多个容器引用。 Batch 会将指定的容器下载到各个节点。 如果容器无法下载,则 computeNodeError 属性将报告失败,并将节点状态设置为 unusable

节点 OS 更新

对于 Windows 池,默认情况下 enableAutomaticUpdates 设置为 true。 尽管建议允许自动更新,但更新可能会中断任务进度,尤其是在任务长时间运行的情况下。 如果需要确保 OS 更新不会意外发生,则可以将此值设置为 false

处于“不可用”状态的节点

由于多种原因,Batch 可能将 computeNodeState 设置为 unusable。 无法将任务计划到某个 unusable 节点,但该节点仍会产生费用。

如果 Batch 可以确定原因,则 computeNodeError 属性会报告该原因。 如果节点处于某个 unusable 状态,但没有 computeNodeError,则表示 Batch 无法与 VM 通信。 在这种情况下,Batch 始终会尝试恢复 VM。 但是,Batch 不会自动尝试恢复无法安装应用程序包或容器的 VM,即使其状态为 unusable

节点处于 unusable 状态的其他原因可能包括:

  • 自定义 VM 映像无效。 例如,未正确准备映像。
  • 由于基础结构故障或低级别的升级,移动了 VM。 Batch 会恢复节点。
  • 将 VM 映像部署到了不支持它的硬件上。 例如,在 Standard_D1_v2 VM 上部署 CentOS HPC 映像。
  • VM 处于 Azure 虚拟网络中,而流量已被阻止进入主要端口。
  • VM 位于虚拟网络中,但流向 Azure 存储的出站流量已被阻止。
  • VM 位于使用自定义 DNS 配置的虚拟网络中,且 DNS 服务器无法解析 Azure 存储。

节点代理日志文件

每个池节点上运行的 Batch 代理进程可以提供日志文件,如需就池节点问题联系支持部门,这些文件可能会有所帮助。 可以通过 Azure 门户、Batch Explorer 或计算节点 - 上传 Batch 服务日志 API 上传节点的日志文件。 上传并保存日志文件后,可以删除节点或池,以节省运行节点的成本。

节点磁盘已满

Batch 使用节点池 VM 上的临时驱动器来存储文件,例如以下作业文件、任务文件和共享文件:

  • 应用程序包文件
  • 任务资源文件
  • 下载到了某个 Batch 文件夹的特定于应用程序的文件
  • 每次执行任务应用程序所用的 Stdoutstderr 文件
  • 特定于应用程序的输出文件

Batch 创建池节点时,应用程序包或启动任务资源文件等文件仅写入一次。 即使只写入一次,但如果这些文件太大,它们也可能会将临时驱动器填满。

其他文件(如 stdoutstderr)针对节点运行的每个任务写入。 如果在同一节点上运行大量任务并且/或者任务文件太大,这些文件可能会将临时驱动器填满。

启动后,该节点还需要使用 OS 磁盘上的少量空间来创建用户。

临时驱动器的大小取决于 VM 大小。 选择 VM 大小时需考虑的一个因素是,确保临时驱动器具有足够的空间来容纳已计划的工作负载。

在 Azure 门户中添加池时,可以显示 VM 大小的完整列表,包括“资源磁盘大小”列。 介绍 VM 大小的文章包含具有“临时存储”列的表。 有关详细信息,请参阅计算优化虚拟机大小。 有关大小表的示例,请参阅 Fsv2-series

可以为每个任务写入的文件指定保留时间。 保留时间决定了在自动清理任务文件之前可将其保留多长时间。 可以缩短保留时间以降低存储要求。

如果临时磁盘或 OS 磁盘空间不足,或空间即将耗尽,则节点将移动到 unusablecomputeNoteState,并且节点错误将指出磁盘已满。

如果你不确定哪些内容占用了节点空间,请尝试远程连接节点并手动调查。 还可以使用文件 - 从计算节点中列出 API 检查 Batch 托管文件夹中的文件,例如任务输出。 此 API 只列出 Batch 托管目录中的文件。 如果任务在其他位置创建了文件,则此 API 不会显示这些文件。

确保从节点检索所需的任何数据或将其上传到持久存储后,可以根据需要删除数据以释放空间。

可以删除已完成的作业或其任务数据仍位于节点上的任务。 查看节点上 taskInformation 中的 recentTasks 集合,或使用文件 - 从计算节点中列出 API。 删除作业会同时删除作业中的所有任务。 删除作业中的任务会触发删除节点上任务目录中的数据,并释放空间。 释放足够的空间后,重新启动节点。 节点应移出 unusable 状态,然后再次移入 idle 状态。

若要恢复 VirtualMachineConfiguration 池中的不可用节点,可以使用池 - 删除节点 API 从池中删除节点。 然后,你可以再次扩展池,使用新节点替换有问题的节点。 对于 CloudServiceConfiguration 池,可以使用计算节点 - 重置映像 API 来清理整个磁盘,从而重置节点映像。 VirtualMachineConfiguration 池目前不支持重置映像。

后续步骤