本页面介绍了如何解决 Batch 的问题。
如果您尝试排查某个作业的问题,但没有收到任何错误消息,请先查看状态事件,检查作业的历史记录是否包含任何错误消息,然后再查看本文档。
如需详细了解如何排查作业问题,另请参阅以下文档:
作业创建错误
如果您无法创建作业,则可能是本部分中的某个错误所致。
配额不足
问题
尝试创建作业时,出现以下问题之一:
当作业处于
QUEUED
状态时,statusEvents
字段中会显示以下问题:Quota checking process decides to delay scheduling for the job JOB_UID due to inadequate quotas [Quota: QUOTA_NAME, limit: QUOTA_LIMIT, usage: QUOTA_CURRENT_USAGE, wanted: WANTED_QUOTA.].
此问题表示,由于
QUOTA_NAME
配额的当前用量 (QUOTA_USAGE
) 和限额 (QUOTA_LIMIT
) 阻止了作业的请求用量 (WANT_QUOTA
),导致作业延迟。当作业处于
QUEUED
、SCHEDULED
或FAILED
状态时,statusEvents
字段中会显示以下问题之一:RESOURCE_NAME creation failed: Quota QUOTA_NAME exceeded. Limit: QUOTA_LIMIT in region REGION
RESOURCE_NAME creation failed: Quota QUOTA_NAME exceeded. Limit: QUOTA_LIMIT in zone ZONE
此问题表示,由于请求超出
QUOTA_NAME
配额(在指定位置的上限为QUOTA_LIMIT
),因此创建资源失败。
解决方案
如需解决此问题,请执行以下操作:
如果作业被延迟,请尝试等待更多配额释放。
如果作业因配额不足而失败,或者这些延迟问题持续存在,请尝试通过以下任一方式来防止配额不足:
创建使用较少该配额或使用其他配额的作业。 例如,为作业指定其他允许的位置或资源类型,或者在其他项目中分摊配额用量。
通过 Google Cloud为您的项目申请更高的配额限制。
权限不足,无法充当服务账号
问题
尝试创建作业时出现以下问题:
如果作业未使用实例模板,则问题会显示为以下内容:
caller does not have access to act as the specified service account: SERVICE_ACCOUNT_NAME
如果作业使用实例模板,则问题会显示为以下内容:
Error: code - CODE_SERVICE_ACCOUNT_MISMATCH, description - The service account specified in the instance template INSTANCE_TEMPLATE_SERVICE_ACCOUNT doesn't match the service account specified in the job JOB_SERVICE_ACCOUNT for JOB_UID, project PROJECT_NUMBER
此问题通常是因为创建作业的用户没有足够的权限来充当作业所使用的服务账号(由 iam.serviceAccounts.actAs
权限控制)。
解决方案
如需解决此问题,请执行以下操作:
- 如果作业使用实例模板,请验证实例模板中指定的服务账号是否与作业定义中指定的服务账号一致。
- 确保创建作业的用户已被授予作业指定的服务账号的 Service Account User 角色 (
roles/iam.serviceAccountUser
)。如需了解详情,请参阅管理访问权限。 - 重新创建作业。
重复的网络
问题
尝试创建作业时出现以下问题:
Networks must be distinct for NICs in the same InstanceTemplate
出现此问题的原因是您为作业多次指定了网络。
解决方案
如需解决此问题,请重新创建作业,并使用以下任一选项指定网络:
- 虚拟机实例模板:如果您想在创建此作业时使用虚拟机实例模板,则必须在虚拟机实例模板中指定网络。
network
和subnetwork
字段:当您使用 Batch API 创建作业时,可以在请求正文中使用这些字段;当您使用 gcloud CLI 创建作业时,可以在 JSON 配置文件中使用这些字段。--network
和--subnetwork
标志:使用 gcloud CLI 创建作业时,可以将这些标志与gcloud batch jobs submit
命令搭配使用。
如需了解详情,请参阅为作业指定网络。
VPC Service Controls 的网络无效
问题
尝试创建作业时出现以下问题:
no_external_ip_address field is invalid. VPC Service Controls is enabled for the project, so external ip address must be disabled for the job. Please set no_external_ip_address field to be true
解决方案
出现此问题的原因是,您尝试在 VPC Service Controls 服务边界内创建并运行具有外部 IP 地址的虚拟机的作业。
如需解决此问题,请创建一项作业,以阻止所有虚拟机的外部访问权限。
如需详细了解如何在 VPC Service Controls 服务边界内为作业配置网络,请参阅将 VPC Service Controls 与 Batch 搭配使用。
作业问题和失败错误
如果作业无法正常运行或因不明原因而失败,则可能是由于本部分中的某个错误或以下任务失败退出代码部分中的某个退出代码所致。
Cloud Logging 中没有日志
问题
您需要调试作业,但 Cloud Logging 中未显示该作业的任何日志。
此问题通常是由于以下原因造成的:
- 您的项目未启用 Cloud Logging API。 即使您为作业日志正确配置了所有其他内容,如果未为项目启用该服务,作业也不会生成日志。
- 作业的服务账号无权写入日志。如果没有足够的权限,作业就无法生成日志。
- 作业未配置为生成日志。如需在 Cloud Logging 中生成日志,作业需要启用 Cloud Logging。还应将作业的可运行对象配置为将您希望显示在日志中的任何信息写入标准输出 (stdout) 和标准错误 (stderr) 流。如需了解详情,请参阅使用日志分析作业。
- 任务未运行。必须先为任务分配资源并开始运行,然后才能生成日志。
- Cloud Logging 已配置为自动排除作业的日志。 如果您已为 Cloud Logging 配置排除项过滤条件,导致 Batch 作业的日志被排除,则这些日志可能不会显示。
解决方案
如需解决此问题,请执行以下操作:
- 请停用所有当前的 Cloud Logging 排除项过滤条件,确保日志未被自动从 Cloud Logging 中排除。
- 确保您的项目已启用 Cloud Logging API。
- 确保作业的服务账号具有 Logs Writer (
roles/logging.logWriter
) IAM 角色。如需了解详情,请参阅为项目启用 Batch。 - 使用 gcloud CLI 或 Batch API 查看作业的详细信息。
作业详情可帮助您了解作业未生成日志的原因,并可能提供您希望从日志中获取的信息。例如,执行以下操作:
- 如需验证是否已启用日志记录,请查看作业的
logsPolicy
字段。 - 如需验证作业是否已成功完成,请查看作业的
status
字段。
- 如需验证是否已启用日志记录,请查看作业的
做出任何更改后,重新创建作业,并等待作业运行完毕,然后再检查日志。
无服务代理报告
问题
对于未正常运行或在创建虚拟机之前失败的作业,statusEvents
字段中会显示以下问题:
No VM has agent reporting correctly within time window NUMBER_OF_SECONDS seconds, VM state for instance VM_NAME is TIMESTAMP,agent,start
此问题表示作业的任何虚拟机均未向 Batch 服务代理报告。
此问题通常是由于以下原因造成的:
- 作业的虚拟机没有足够的权限。
作业的虚拟机需要特定权限才能向 Batch 服务代理报告其状态。您可以向作业的服务账号授予 Batch Agent Reporter 角色 (
roles/batch.agentReporter
),从而为作业的虚拟机提供这些权限。 - 作业的虚拟机存在网络问题。作业的虚拟机需要网络访问权限才能与 Batch 服务代理通信。
- 作业的虚拟机使用的是过时的 Batch 虚拟机操作系统映像,或者使用的是具有过时的 Batch 服务代理软件的虚拟机操作系统映像。 作业的虚拟机需要在其虚拟机操作系统映像中包含可为向 Batch 服务代理报告提供当前依赖项的软件。
解决方案
如需解决此问题,请执行以下操作:
验证作业的虚拟机是否具有向 Batch 服务代理报告其状态所需的权限。
- 如需确定作业的服务账号,请使用 gcloud CLI 或 Batch API 查看作业的详细信息。如果未列出任何服务账号,作业默认使用 Compute Engine 默认服务账号。
确认作业的服务账号具有 Batch Agent Reporter 角色 (
roles/batch.agentReporter
) 的权限。如需了解详情,请参阅管理访问权限和限制服务账号使用。例如,如需向 Compute Engine 默认服务账号授予所需权限,请使用以下命令:
gcloud projects add-iam-policy-binding PROJECT_ID \ --role roles/batch.agentReporter \ --member serviceAccount:PROJECT_NUMBER-compute@developer.gserviceaccount.com
验证作业的虚拟机是否具有适当的网络访问权限。 如需了解详情,请参阅 Batch 网络概览和排查常见网络问题。
如果您为作业指定了虚拟机操作系统映像,请验证该虚拟机操作系统映像是否目前受支持。
如果您为作业启用了 Cloud Logging,则可以通过检查以下任何代理日志 (
batch_agent_logs
) 来确定此问题。如需了解详情,请参阅使用日志分析作业。过时的 Batch 服务代理软件的错误日志:
rpc error: code = FailedPrecondition, desc = Invalid resource state for BATCH_AGENT_VERSION: outdated Batch agent version used.
BATCH_AGENT_VERSION 是作业用于与 Batch 服务代理通信的软件版本,例如
cloud-batch-agent_20221103.00_p00
。过时的 Batch 虚拟机操作系统映像错误日志:
rpc error: code = FailedPrecondition, desc = Invalid resource state for BATCH_VM_OS_IMAGE_NAME: outdated Batch image version.
BATCH_VM_OS_IMAGE_NAME 是作业使用的 Batch 虚拟机操作系统映像的特定版本,例如
batch-debian-11-20220909-00-p00
。
您可以使用较新的虚拟机操作系统映像来解决此问题。 如果作业使用自定义映像,请基于最新版本的受支持的公共映像重新创建自定义映像。
如需了解详情,请参阅受支持的虚拟机操作系统映像和查看虚拟机操作系统映像。
重新创建作业。
Cloud Monitoring 中缺少资源指标
问题
您想查看作业的资源指标,但缺少部分或全部预期指标。
此问题通常是由于以下原因造成的:
- 您的项目未启用该 API。 即使您正确配置了项目中的所有其他内容,资源指标也可能在 Cloud Monitoring API 启用后才会显示。对于 Ops Agent,您还必须启用 Cloud Logging API。
- 您无权查看这些指标。如果您没有足够的权限,则无法查看指标。
- 作业的虚拟机未运行。在作业的至少一个虚拟机运行之前,无法为该作业生成指标。
- 作业的配置或权限不支持 Ops Agent 指标。 某些资源指标只能由 Ops Agent 提供。如需支持 Ops Agent 指标,作业必须满足 Ops Agent 的要求、安装 Ops Agent,并使用可将指标写入监控的服务账号。
- 您需要使用其他方法或过滤条件来查看相应指标。 某些查看指标的方法不会显示已删除虚拟机的指标。此外,如果指标被过滤条件或显示的时间段排除,则不会显示。此外,指标图表的分辨率可调,这可能会导致少量数据过少而无法显示。
- 指标已删除。指标删除后(在监控保留期限过后会自动删除),您将无法查看。
解决方案
如果仅缺少 Ops Agent 指标,请先尝试通过执行以下操作来解决问题:
- 通过执行以下操作来验证作业的配置:
- 如需查看作业的完整配置信息,请使用 gcloud CLI 或 Batch API 查看作业的详细信息。在剩余步骤中使用此输出。
- 确保作业的服务账号具有写入 Ops Agent 的权限。
- 确保作业满足所有 Ops Agent 要求。
- 确保作业正确安装了 Ops Agent。虽然可以在可运行的实例中手动安装 Ops Agent,但建议的方法是通过将
installOpsAgent
字段设置为true
来自动安装 Ops Agent。
- 如果问题仍然存在,请参阅 Google Cloud Observability 文档中的排查 Ops 代理问题。
否则,请执行以下操作来解决此问题:
- 确保已为您的项目启用 Monitoring API:
- 确保作业的虚拟机已开始运行,并且运行时间仍在监控保留期限内。 您可以查看作业的详细信息,了解作业的运行时间。
- 请执行以下操作,验证您用于查看指标的方法是否存在任何问题:
- 如果问题仍然存在,请参阅 Google Cloud Observability 文档中的排查 Cloud Monitoring 问题页面。
虚拟机外部 IP 地址的限制条件遭到违反
问题
失败作业的 statusEvents
字段中会显示以下问题:
Instance VM_NAME creation failed: Constraint constraints/compute.vmExternalIpAccess violated for project PROJECT_NUMBER. Add instance VM_NAME to the constraint to use external IP with it.
出现此问题的原因是,您的项目、文件夹或组织已设置 compute.vmExternalIpAccess
组织政策限制条件,因此只有列入许可名单的虚拟机才能使用外部 IP 地址。
解决方案
如需解决此问题,请重新创建作业,然后执行以下某项操作:
- 使用不受相应限制条件约束的项目。
- 创建一项作业,以阻止所有虚拟机的外部访问。
违反了可信映像的限制条件
问题
失败作业的 statusEvents
字段中会显示以下问题:
Instance VM_NAME creation failed: Constraint constraints/compute.trustedImageProjects violated for project PROJECT_ID. Use of images from project batch-custom-image is prohibited.
解决方案
出现此问题的原因是,您的项目已设置可信映像 (compute.trustedImageProjects
) 政策限制,因此不允许使用 batch-custom-image
映像项目中的 Batch 映像。
如需解决此问题,请至少执行以下某项操作:
- 重新创建作业,以指定可信映像政策限制已允许的虚拟机操作系统映像。
- 请让管理员允许修改可信映像政策限制条件,以允许使用来自
batch-custom-image
映像项目的虚拟机操作系统映像。如需了解相关说明,请参阅控制对 Batch 的虚拟机操作系统映像的访问权限。
使用实例模板时作业失败
问题
对于使用实例模板的失败作业,statusEvents
字段中会显示以下问题:
INVALID_FIELD_VALUE,BACKEND_ERROR
此问题是由于作业的实例模板存在不明确的问题而导致的。
解决方案
如需进一步调试问题,请执行以下操作:
任务失败退出代码
如果作业中的特定任务失败,该任务会返回非零的退出代码。根据您配置 ignoreExitStatus
字段的方式,失败的任务可能会导致作业失败,也可能不会。
除了您在可运行对象中定义的任何退出代码之外,批处理还具有多个预留的退出代码,包括以下退出代码。
虚拟机抢占 (50001)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to Spot Preemption with exit code 50001.
如果作业的 Spot 虚拟机在运行时被抢占,就会出现此问题。
解决方案
如需解决此问题,请执行以下某项操作:
- 使用自动重试任务或手动重新运行作业来重试任务。
- 如需保证不会发生抢占,请改用采用标准预配模型的虚拟机。
虚拟机报告超时 (50002)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to Batch no longer receives VM updates with exit code 50002.
当后端出现超时时,Batch 将不再接收来自作业虚拟机的更新,从而导致此问题。遗憾的是,许多硬件故障或软件故障都可能导致虚拟机无响应,例如,虚拟机可能会因临时主机事件或资源不足而崩溃。
解决方案
如需解决此问题,请执行以下操作:
- 如果问题是暂时性的,并且可以自行解决,请使用自动重试任务或手动重新运行作业来重试任务。
如果问题仍然存在,请执行以下一项或多项操作,以找出并解决导致虚拟机无响应的原因:
推荐:通过Google Cloud 支持或 Cloud 论坛上的 Batch 标签获取支持。
尝试自行找出并解决问题。例如,如果您熟悉 Compute Engine,可以尝试通过以下方式排查作业虚拟机的相关问题:
如需确定作业的虚拟机的名称,请执行以下操作:
- 查看作业的日志。
- 过滤日志,查找包含短语
report agent state:
的条目。 查看日志,确定每次尝试执行每个任务时所用的虚拟机。每个日志都类似于以下内容,其中包含一个
instance:
短语和一个或多个task_id:
短语。report agent state: ... instance:"INSTANCE_NAME" ... task_id:"task/JOB_UID-group0-TASK_INDEX/TASK_RETRIES/0 ..."
此日志包含以下值:
INSTANCE_NAME
:虚拟机的名称。JOB_UID
:作业的唯一 ID (UID)。TASK_INDEX
:任务的索引。TASK_RETRIES
:在此虚拟机上运行的任务的尝试次数,格式为重试次数。 例如,对于任务的第一次尝试,此值为0
。除非您启用自动重试任务,否则每个任务只会尝试一次。
使用 Compute Engine 文档排查作业虚拟机的相关问题。例如,请参阅排查虚拟机关停和重新启动问题以及排查虚拟机启动问题。
执行期间虚拟机重新启动 (50003)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to VM is rebooted during task execution with exit code 50003.
当作业的虚拟机在运行时意外重新启动时,就会出现此问题。
解决方案
如需解决此问题,请使用自动重试任务或手动重新运行作业来重试任务。
虚拟机和任务无响应 (50004)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to tasks cannot be canceled with exit code 50004.
当任务达到无响应时间限制且无法取消时,就会出现此问题。
解决方案
如需解决此问题,请使用自动重试任务或手动重新运行作业来重试任务。
任务运行时间超过最长运行时间 (50005)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to task runs over the maximum runtime with exit code 50005.
此问题会在以下情况下发生:
- 任务的运行时间超过了
maxRunDuration
字段中指定的时间限制 - 可运行对象的运行时间超过了
timeout
字段中指定的时间限制
如需具体了解超出的是哪个时间限制,请查看作业的日志,并找到提及 50005
退出代码的日志。此日志的 textPayload
字段表示超出时间限制的位置和时间。
解决方案
如需解决此问题,请尝试验证超出时间限制的任务或可运行对象所需的总运行时间。然后,执行以下操作之一:
如果您只是偶尔遇到此错误(例如,对于运行时不一致的任务或可运行对象),可以尝试重新创建作业并将其配置为自动重试任务,以尝试提高成功率。
否则,如果任务或可运行对象始终有意需要比当前超时时间更长的时间才能完成运行,请设置更长的超时时间。
执行期间重新创建的虚拟机 (50006)
问题
作业的 statusEvents
字段中显示以下问题:
Task state is updated from PRE-STATE to FAILED on zones/ZONE/instances/INSTANCE_ID due to VM is recreated during task execution with exit code 50006.
当作业的虚拟机在运行时意外重新创建时,就会出现此问题。
解决方案
如需解决此问题,请使用自动重试任务或手动重新运行作业来重试任务。