排解 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 資料欄。
後續步驟
- 進一步瞭解如何使用預留項目管理工作負載。
- 瞭解如何管理工作負載預留項目。
- 瞭解如何監控預留項目和使用管理資源圖表。
- 探索其他 BigQuery 疑難排解資源。