排查 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 未使用预留来运行作业

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

查询和预留位于不同的区域

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

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

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

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

服务类型不匹配

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

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

多语句查询

如果您运行多语句查询,则父作业对象没有与之关联的预留,即使子作业在预留下运行也是如此。

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

检索缓存的结果

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

变更数据捕获行修改操作

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

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

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 的增量。

必须启用基于预留的公平性,才能使用槽数上限

错误消息

  • Cannot use max slots without enabling reservation-based fairness.

原因

您正在尝试配置最大预留容量(例如 max_slots 或可预测预留),这需要在拥有预留的项目上启用基于预留的公平性。

解决方法

您必须在项目中启用基于预留的公平性。

排查槽争用问题

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

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

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

作业并发数激增

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

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

槽用量高

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

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

作业时长过长

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

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

槽争用消息

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

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

排查预留监控问题

以下部分介绍了如何解决监控 BigQuery 预留和槽用量时的常见问题。

槽位用量指标与 INFORMATION_SCHEMA 不匹配

如果您发现资源图表中的槽用量指标与 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 位于同一管理项目、区域和版本中,有 100 个槽,其工作负载需要 150 个槽,并且配置了 ignore_idle_slots=false。预留 B 可以从预留 A 借用 50 个空闲槽来满足其需求。发生这种情况时,监控图表会报告预留 A 的 50 个lent_slots和预留 B 的 50 个borrowed_slots。

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

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

在预留完全使用之前,借用的槽就会出现

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

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

后续步骤