排查 BigQuery 工作负载管理问题

本文档介绍了如何排查 BigQuery 工作负载管理方面的常见问题,包括预留分配和指派、预留配置错误、容量承诺、槽争用和预留监控。

如需查看和管理预留、承诺和管理资源图表,请确保您在管理项目上拥有所需的 Identity and Access Management (IAM) 角色,例如 BigQuery Resource Viewer (roles/bigquery.resourceViewer) 或 BigQuery Resource Admin (roles/bigquery.resourceAdmin) 角色。如需了解详情,请参阅使用 IAM 进行访问权限控制。

排查与预留相关的问题

使用以下信息可排查预留的常见问题,例如添加槽时出现的错误、预留未用于 BigQuery 作业的原因,或无法识别的预留。

无法向预留大小添加更多槽

如果您在尝试向预留中添加更多槽时遇到 Failed to allocate slots for reservation in the current system state 或 Failed to update reservation: Failed to allocate slots for reservation 等错误,这通常是暂时性问题。如需缓解此问题,请执行以下操作:

  • 请减少广告资源数量,然后重试。
  • 如果尝试使用较少的槽失败,请等待 15 分钟,然后重试该操作。

如果您在多次重试并等待 30 分钟后仍收到相同的错误,请与 Cloud Customer Care 联系。

配额不足,无法完成此请求

如果错误消息显示 There is insufficient quota to complete this request,则表示请求超出了为项目设置的配额限制。

如需解决此错误,请执行以下操作之一:

  • 向预留中添加较少的槽,以免请求超出配额限制。
  • 在相应区域中申请增加配额。如需了解详情,请参阅申请增加配额。

BigQuery 未使用预留来运行作业

在多种情况下,作业可能会使用按需付费价格或免费共享槽池运行,而不是使用您创建的预留。

查询和预留位于不同区域

预留是区域级资源。查询的运行位置与查询中引用的任何表相同。

如果表的位置与预留的位置不匹配,查询不会使用预留,而是会使用按需价格运行(对于符合条件的批量加载和导出作业,则会使用免费的共享槽池)。

查询 BigQuery Omni 表

查询 BigQuery Omni 表时,请确保预留是在与该表相同的区域中创建的,而不是在共置区域中创建的。如果您在共置 BigQuery 区域中创建预留,则查询会按需运行。

预留已创建,但项目未分配给该预留

如需使用预留中的槽,您必须创建分配,将项目、文件夹或组织分配给特定预留。确保项目具有相应的预留分配。

服务类型不匹配

创建分配时,请务必选择正确的服务类型,否则作业将不会使用预留。

例如,如果您选择 PIPELINE 作为服务类型,则所有查询作业都将使用按需价格运行。将分配类型更改为 QUERY,以使查询作业使用预留运行。

多语句查询

如果您运行的是多语句查询,则父作业对象不会关联任何预留,即使子作业是在预留下运行也是如此。

如需确认作业是否实际使用了预留,请检查子作业元数据。

检索缓存的结果

当查询作业检索缓存的结果时,预留字段为空,因为 BigQuery 不会执行任何计算,而是直接从临时表中提取结果。

变更数据捕获行修改操作

如果您有变更数据捕获 (CDC) 表,BigQuery 会在 max_staleness 时间间隔内应用待处理的行修改,作为使用 BACKGROUND 分配类型的后台作业。如果没有 BACKGROUND 分配,这些作业将使用按需定价。请考虑为项目创建 BACKGROUND 分配,以避免产生意外的按需费用。您可以通过作业标识符中的 queueworker_cdc_background_merge_coalesce 子字符串来识别这些作业。

使用外部服务的 BigQuery ML 模型类型

如果项目中未找到具有 ML_EXTERNAL 服务类型的预留分配,则外部模型创建作业将使用按需价格运行。QUERY 服务类型分配适用于标准 BigQuery ML 模型和矩阵分解模型(需要企业版或企业 Plus 版预留),而外部模型需要 ML_EXTERNAL 分配。如需了解详情,请参阅为 BigQuery 工作负载分配槽。

项目中发现无法识别的预留

BigQuery 拥有预留,这些预留代表一个免费的共享槽池,用于在 BigQuery 中执行某些操作。

default-pipeline

默认情况下,在 BigQuery 中批量加载或导出数据会使用免费的共享槽池。当您检查这些加载或提取作业时,预留字段会显示 default-pipeline。

使用共享槽池无需付费。如果您希望获得稳定、可预测的性能,请考虑购买 PIPELINE 预留。

排查预留管理任务问题

在创建或更新预留时,您可能会遇到以下错误。

预留大小或基准槽数必须是 50 的倍数

错误消息

  • Max reservation size can only be configured in multiples of 50, except when covered by excess commitments.
  • Baseline slots can only be configured in multiples of 50, except when covered by excess commitments.

原因

槽始终会自动扩缩到 50 的倍数。BigQuery 会根据实际用量纵向扩容槽,并向上取整到最接近的 50 个槽增量。如果没有承诺,或者承诺无法涵盖增加的量,您只能以 50 的倍数增加基准槽和自动扩缩槽。

如果 baseline slots 或 max reservation size - baseline slots 不是 50 的倍数(且未由过剩容量承诺涵盖),则预留无法扩容到预留大小上限,从而导致此错误。

解决方法

执行下列其中一项操作:

  • 购买更多容量承诺,以涵盖增加的槽。
  • 选择以 50 为增量的基准槽数和最大槽数。

排查容量承诺问题

本部分介绍了在您遇到 BigQuery 容量承诺问题时可能会有帮助的问题排查步骤。

已购买的槽待处理

槽受到可用容量的限制。在您购买槽用量承诺并且 BigQuery 分配承诺后,状态列会显示对勾标记。如果 BigQuery 无法立即分配请求的槽,则状态列会保持待处理状态。您可能需要等待几小时才能使用这些槽。如果您需要更快地访问槽,请尝试以下操作:

  1. 删除待处理的承诺。
  2. 购买数量更少的槽的新承诺。规模较小的承诺可能会立即生效,具体取决于容量。
  3. 以单独的承诺购买其余的槽。这些槽可能会在状态列中显示为待处理,但通常在几个小时内变为有效。
  4. 可选:当两项承诺都生效时,如果这两项承诺属于同一区域和版本,并且具有相同的承诺方案,则可将它们合并为一项承诺。

如果槽位承诺失败或需要很长时间才能完成,请考虑暂时使用按需付费价格。借助此解决方案,您可以在未分配给任何预留的其他项目中运行关键查询,将项目分配给 None,或完全移除项目分配。

排查槽争用问题

如果槽不足以运行您的所有作业,就会发生槽争用,从而导致性能问题。如需分析性能下降是否源于工作负载增加或环境配置更改,您可以比较预留和项目之间的两个系统间隔。

如需排查槽争用问题,请按照以下步骤和最佳实践操作。

如果您已尝试这些最佳实践,但仍遇到作业性能问题,可以请求支持。

作业并发数激增

使用管理资源图表中的详细信息视图检查是否存在同时存在槽位使用量激增的情况,以便检查作业运行是否突然激增。这些峰值可能表示有太多作业在争夺预留中可用的槽位。

最佳实践:考虑优化资源密集型查询或增加预订的槽位容量。如需详细了解如何优化查询性能,请参阅优化查询计算。

槽用量高

使用详细信息视图检查作业时长是否增加,尤其是当有作业超出预留的最大容量时。槽使用率一直很高可能表示槽争用正在进行中。

最佳实践:使用作业探索器的槽争用过滤器检查查询,以找出消耗槽最多的查询并对其进行优化。

作业时长过长

如果作业需要更长时间才能完成,请查看详细信息视图。作业并发数和槽用量高峰可能表明存在槽争用。

最佳实践:通过暂时暂停不太重要的作业或降低整体作业提交速率,隔离关键作业。

槽争用消息

分析洞见表可以显示 There were NUMBER jobs detected with slot_contention in the reservation. 等消息,以指明槽争用问题。请查看作业探索器,了解这些消息中标记的特定作业的详细信息。

最佳实践:优化已确定的查询,或调整预订的槽位分配。

排查预留监控问题

以下部分介绍了如何解决在监控 BigQuery 预留和 slot 使用情况时遇到的常见问题。

广告资源块使用情况指标与 INFORMATION_SCHEMA 不一致

如果您发现资源图表中的 slot 使用情况指标与 INFORMATION_SCHEMA 数据之间存在差异,请尝试以下操作:

  • 降低粒度。将图表粒度更改为 1 秒间隔,而不是 1 小时间隔。
  • 对齐汇总。请确保您使用的聚合方法在资源图表和 INFORMATION_SCHEMA 数据之间保持一致。例如,为了更好地反映资源图表中的峰值用量,请始终将指标聚合更改为 p99 或 p90。

停用空闲时段后,系统会显示借用的时段

即使为一项或多项预留设置了 ignore_idle_slots=true,监控图表也可能会显示 borrowed_slots 的非零值。此设置可防止预留借用空闲槽,但不会阻止预留将其未使用的槽借出给其他预留。

在以下情况下,系统会显示这些借用的广告资源:

  • 借给其他预留。具有 ignore_idle_slots=true 的预留可将其未使用的基准槽借给同一管理项目、区域和版本中允许借用空闲槽 (ignore_idle_slots=false) 的其他预留。如果管理项目、区域和版本中的所有预留都具有 ignore_idle_slots=true,则它们之间不会共享空闲槽。

    例如,假设预留 A 有 100 个槽,用量为 0,并配置为 ignore_idle_slots=true。预留 B 与预留 A 位于同一管理项目、区域和版本中,有 100 个 slot,其工作负载需要 150 个 slot,并且配置为 ignore_idle_slots=false。预留 B 可以从预留 A 借用 50 个空闲槽来满足其需求。发生这种情况时,监控图表会报告预留 A 的值为 50 lent_slots,预留 B 的值为 50 borrowed_slots。

  • 用量超出容量。如果预留的槽用量暂时超出其容量(基准槽数 + 自动扩缩槽数),监控图表会将此差额显示为 borrowed_slots。即使是具有 ignore_idle_slots=true 的预留,也可能会出现此行为。

槽用量有时可能会超过基准槽数和扩缩的槽数之和。您不需要为超过基准槽数和扩缩的槽数的槽用量付费。

借用的槽位会在预留完全用尽之前显示

监控信息中心使用抽样数据,这些数据可能无法准确反映抽样间隔内 slot 使用情况的确切时间。

如需更准确地分析槽位使用情况,请查询与空闲槽位相关的列,例如 INFORMATION_SCHEMA.RESERVATIONS_TIMELINE 视图中的 borrowed_slots 和 lent_slots 列。

后续步骤