本页介绍了如何解决与批处理相关的问题。
如果您尝试排查没有错误消息的作业问题,请先查看状态事件,检查作业的记录是否包含任何错误消息,然后再查看本文档。
如需详细了解如何排查作业问题,请参阅以下文档:
作业创建错误
如果您无法创建作业,则可能是本部分中的某个错误造成的。
配额不足
问题
尝试创建作业时发生以下问题之一:
当作业处于
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
解决方案
出现此问题是因为您尝试使用具有外部 IP 地址的虚拟机在 VPC Service Controls 服务边界中创建和运行作业。
如需解决此问题,请创建一个作业来阻止所有虚拟机的外部访问。
如需详细了解如何在 VPC Service Controls 服务边界中为作业配置网络,请参阅将 VPC Service Controls 与批处理搭配使用。
作业问题和失败错误
如果您的作业无法正常运行或因原因不明而失败,则可能是由于本部分中的某个错误或以下任务失败退出代码部分中的某个退出代码所致。
Cloud Logging 中没有日志
问题
您需要调试作业,但 Cloud Logging 中没有显示该作业的日志。
出现此问题的常见原因如下:
- 您的项目未启用 Cloud Logging API。 即使您为作业的日志正确配置了所有其他内容,如果您的项目未启用该服务,作业也不会生成日志。
- 作业的服务账号无权写入日志。如果没有足够的权限,作业将无法生成日志。
- 作业未配置为生成日志。如需在 Cloud Logging 中生成日志,作业需要启用 Cloud Logging。您还应配置作业的可运行文件,以将您希望显示在日志中的所有信息写入标准输出 (stdout) 和标准错误 (stderr) 流。如需了解详情,请参阅使用日志分析作业。
- 任务未运行。只有在任务分配了资源并开始运行后,才能生成日志。
- Cloud Logging 已配置为自动排除作业的日志。 如果您配置了Cloud Logging 的排除过滤条件,导致批处理作业的日志被排除,则这些日志将不会显示。
解决方案
如需解决此问题,请执行以下操作:
- 停用当前的所有 Cloud Logging 排除过滤条件,确保日志不会自动从 Cloud Logging 中排除。
- 确保您的项目已启用 Cloud Logging API。
- 确保作业的服务账号具有 Logs Writer (
roles/logging.logWriter
) IAM 角色。如需了解详情,请参阅为项目启用批处理。 - 使用 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
此问题表示作业的所有虚拟机都没有向批处理服务代理报告。
出现此问题通常是因为:
- 作业的虚拟机没有足够的权限。
作业的虚拟机需要特定权限才能向批处理服务代理报告其状态。您可以通过向作业的服务账号授予批处理代理报告程序角色 (
roles/batch.agentReporter
),为作业的虚拟机提供这些权限。 - 作业的虚拟机存在网络问题。作业的虚拟机需要网络访问权限才能与批处理服务代理通信。
- 作业的虚拟机使用的是过时的批处理虚拟机操作系统映像,或者使用的虚拟机操作系统映像包含过时的批处理服务代理软件。 作业的虚拟机需要其虚拟机操作系统映像中包含软件,以提供当前依赖项以便向批处理服务代理报告。
解决方案
如需解决此问题,请执行以下操作:
验证作业的虚拟机是否具有向批处理服务代理报告其状态所需的权限。
- 如需识别作业的服务账号,请使用 gcloud CLI 或 Batch API 查看作业的详细信息。如果未列出任何服务账号,则作业默认使用 Compute Engine 默认服务账号。
确认作业的服务账号具有批处理代理报告程序角色 (
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
如果您为作业指定了虚拟机操作系统映像,请验证该虚拟机操作系统映像目前是否受支持。
如果您为作业启用了 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
。过时批处理虚拟机操作系统映像错误的日志:
rpc error: code = FailedPrecondition, desc = Invalid resource state for BATCH_VM_OS_IMAGE_NAME: outdated Batch image version.
BATCH_VM_OS_IMAGE_NAME 是作业使用的来自批处理的虚拟机操作系统映像的特定版本,例如
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 可观测性文档中的排查 Ops Agent 问题。
否则,请通过执行以下操作来解决此问题:
- 确保已为您的项目启用 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-custom-image
映像项目中的虚拟机操作系统映像。如需了解相关说明,请参阅控制对批处理作业虚拟机操作系统映像的访问权限。
使用实例模板时作业失败
问题
使用实例模板的失败作业的 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 论坛上的“批量”标签获取支持。
尝试自行找出问题并加以解决。例如,如果您熟悉 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.
如果作业的虚拟机在运行时意外重新创建,就会出现此问题。
解决方案
如需解决此问题,请使用自动任务重试或手动重新运行作业来重试任务。