排查 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 列。
后续步骤
- 详细了解使用预留管理工作负载。
- 了解如何管理工作负载预留。
- 了解如何监控预留和使用管理资源图表。
- 探索其他 BigQuery 问题排查资源。