排解 BigQuery 工作負載管理問題

本文說明如何排解 BigQuery 工作負載管理的常見問題,包括預留項目分配和指派、預留項目設定錯誤、運算單元爭用,以及預留項目監控。

如要查看及管理預留項目和管理資源圖表,請確認您具備必要的 Identity and Access Management (IAM) 角色,例如管理專案的 BigQuery 資源檢視者 (roles/bigquery.resourceViewer) 或 BigQuery 資源管理員 (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指派作業,以免產生非預期的隨選費用。您可以透過工作 ID 中的 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 資料欄。

後續步驟