排查 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 的倍数。

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

错误消息

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

原因

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

解决方法

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

排查容量承诺问题

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

已购买的槽待处理

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

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

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

排查槽争用问题

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

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

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

作业并发数激增

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

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

槽用量高

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

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

作业时长过长

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

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

槽争用消息

分析洞见表可以显示 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 列。

排查对话日志记录问题

请参考以下信息,排查 BigQuery 中对话式分析对话日志记录的常见问题。由于日志记录错误绝不会导致对话轮次失败,也不会在对话或 Cloud Logging 中报告,因此目标表为空或缺失是配置或权限问题的主要信号。

日志表缺失或为空

如果目标表未创建或在对话轮次后仍为空,请检查以下潜在原因:

  • 对话日志记录不会保存或发布。在 BigQuery Studio 中,刷新页面,重新打开智能体设置,确认启用对话日志记录已开启,目标数据集和表已设置,并且您的更改已发布。

  • 目标数据集缺失或位于其他项目中。确认目标数据集已存在于数据智能体所在的项目中。您可以通过运行 bq show PROJECT_ID:LOG_DATASET 来验证数据集是否存在。将 PROJECT_ID 替换为包含数据智能体的项目的 ID,并将 LOG_DATASET 替换为目标数据集的 ID。服务代理会在第一个记录的回合中创建日志表,但不会创建数据集。

  • 缺少服务代理或 CMEK 权限。确认 Conversational Analytics API 服务代理(service-PROJECT_NUMBER@gcp-sa-geminidataanalytics.iam.gserviceaccount.com,使用代理的项目编号而非项目 ID)对日志数据集具有 BigQuery Data Editor (roles/bigquery.dataEditor) 角色。如果数据集使用客户管理的 Cloud KMS 密钥 (CMEK),请确认 BigQuery 加密服务账号 (bq-PROJECT_NUMBER@bigquery-encryption.iam.gserviceaccount.com) 具有该密钥的 roles/cloudkms.cryptoKeyEncrypterDecrypter 角色。

  • 对话界面或智能体配置不受支持。BigQuery Studio 预览窗格中的对话不会记录。从已发布智能体的主聊天界面进行测试。如果代理使用搜索范围而非特定 BigQuery 表、将属性图配置为知识来源,或者未声明任何 BigQuery 表,则不会记录这些代理。如需了解详情,请参阅限制。

  • 知识源表使用访问权限政策。如果任何知识源表使用行级访问权限政策、列级安全性(政策标记)或动态数据遮盖,则不会记录对话轮次。

  • 现有目标表上存在架构冲突。如果您将现有表配置为目标表,并且某个列与对话日志架构列同名,但类型或模式不同,则 BigQuery 不会将行写入该表。

行通常会在一轮对话完成后几秒内显示。如果您在等待几分钟后仍未看到行,请刷新数据集。

部分用户的对话未记录

原因

在每个回合之前,隐私检查都会使用聊天用户的凭据来验证代理的知识源表是否具有行级安全性、列级安全性或数据遮盖政策。如果用户无权运行此检查,则系统不会记录其轮次。

解决方法

向所有聊天用户授予知识源表的 BigQuery Data Viewer (roles/bigquery.dataViewer) 角色,以及运行其查询的项目的 BigQuery Job User (roles/bigquery.jobUser) 角色,或者授予对知识源表具有 bigquery.tables.get 和 bigquery.rowAccessPolicies.list 权限的自定义角色。

保存智能体失败,并显示 INVALID_ARGUMENT 错误

错误消息

  • The BigQuery Agent Analytics table must be in the same project as the agent (agent project: ..., table project: ...).

  • BigQuery Agent Analytics can only be enabled on agents whose datasource is BigQuery. Remove bigquery_agent_analytics_enabled and bigquery_agent_analytics_table, or point the agent at a BigQuery datasource.

原因

目标数据集与数据智能体位于不同的项目中,或者智能体的数据源不是 BigQuery。

解决方法

选择与数据智能体位于同一项目中的现有目标数据集,或为数据智能体配置 BigQuery 数据源。

由于服务代理不存在,因此无法授予数据集访问权限

错误消息

  • Service account service-PROJECT_NUMBER@gcp-sa-geminidataanalytics... does not exist

原因

尚未在项目中预配 Conversational Analytics API 服务代理。

解决方法

执行下列其中一项操作:

  • 请先在代理上配置日志目标位置,然后再次授予该角色。

  • 通过运行以下命令来预配服务身份:

    gcloud beta services identity create \
        --service=geminidataanalytics.googleapis.com \
        --project=PROJECT_ID

    将 PROJECT_ID 替换为包含数据智能体的项目的 ID。

BigQuery Studio 中不提供对话日志记录设置

原因

您正在查看数据智能体的已发布版本,其配置设置为只读,或者数据智能体未选择特定的 BigQuery 表作为知识来源。

解决方法

将视图选择器切换到草稿,确保选择特定的 BigQuery 表作为知识来源,更新对话日志记录设置,然后发布智能体。

后续步骤