調查高 CPU 使用率

本頁面說明如何使用 CPU 使用率指標和圖表,以及其他內省工具,調查資料庫中的高 CPU 使用率。

找出系統或使用者工作是否導致 CPU 使用率偏高

Google Cloud 主控台提供多種 Spanner 監控工具,可讓您查看執行個體最重要的指標狀態。其中一個圖表是「CPU 使用率 - 總計」。這張圖表會顯示 CPU 總使用率 (以執行個體 CPU 資源百分比表示),並依工作優先順序和作業類型細分。工作分為兩種:使用者工作 (例如讀取和寫入),以及系統工作,後者涵蓋壓縮和索引回填等自動化背景工作。

圖 1 顯示「CPU 使用率 - 總計」圖表的範例。

CPU 使用率 - 總計圖表範例

圖 1. Google Cloud 主控台「監控」資訊主頁的「CPU 使用率 - 總計」圖表。

假設您收到 Cloud Monitoring 發出的警報,指出 CPU 用量大幅增加。您在 Google Cloud 控制台中為執行個體開啟「Monitoring」資訊主頁,並查看 Cloud 控制台中的「CPU Utilization - Total」圖表。如圖 1所示,您可以看到高優先順序使用者工作導致 CPU 使用率增加。接下來,請找出哪些高優先順序使用者作業導致 CPU 使用率升高。

您可以使用「查詢深入分析」資訊主頁,以視覺化方式呈現這項指標和其他指標的時間序列。這些預先建構的資訊主頁可協助您查看 CPU 使用率尖峰,並找出效率不佳的查詢。

找出導致 CPU 使用率飆升的使用者操作

圖 1 中的「CPU 使用率 - 總計」圖表顯示,高優先順序使用者工作是導致 CPU 用量增加的原因。

接下來,您將在 Cloud 控制台中查看「CPU 使用率 (按照作業類型顯示)」圖表。這張圖表顯示 CPU 使用率,並依據使用者啟動的高、中、低優先順序作業進行細分。

什麼是使用者啟動的作業?

使用者啟動的作業,是指透過 API 要求啟動的作業。Spanner 會將這些要求分組為作業類型或類別,您可以在「依作業類型劃分的 CPU 使用率」圖表中,以線條的形式顯示每個作業類型。下表說明各個作業類型所包含的 API 方法。

作業 API 方法 說明
read_readonly 讀取
StreamingRead
包括使用索引鍵查詢和掃描從資料庫擷取資料列的讀取作業。
read_readwrite 讀取
StreamingRead
包括在讀寫交易中執行的讀取作業。
read_withpartitiontoken 讀取
StreamingRead
包括使用一組分區符記執行的讀取作業。
executesql_select_readonly ExecuteSql
ExecuteStreamingSql
包括執行 Select SQL 陳述式和變更串流查詢。
executesql_select_readwrite ExecuteSql
ExecuteStreamingSql
在讀寫交易中執行 Select 陳述式。
executesql_select_withpartitiontoken ExecuteSql
ExecuteStreamingSql
包含使用一組分區符記執行的執行 Select 陳述式。
executesql_dml_readwrite ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
包括執行 DML SQL 陳述式。
executesql_dml_partitioned ExecuteSql
ExecuteStreamingSql
ExecuteBatchDml
包括執行分區 DML SQL 陳述式。
beginorcommit BeginTransaction
Commit
Rollback
包括開始、提交和復原交易。
其他 PartitionQuery
PartitionRead
GetSession
CreateSession
包括 PartitionQuery、PartitionRead、Create Database、Create Instance、工作階段相關作業、內部時間敏感的服務作業等等。

以下是「CPU 使用率 (以作業類型分組)」指標的範例圖表。

範例:CPU 使用率 (以作業類型分組) 圖表

圖 2: Google Cloud 控制台中的CPU 使用率 (按照作業類型顯示) 圖表。

您可以使用圖表頂端的「Priority」選單,將顯示範圍限制為特定優先順序。並在折線圖上標示每個作業類型或類別。圖表下方列出的類別可用來識別每個圖表。您可以選取或取消選取各個類別篩選器,隱藏或顯示各個圖表。

或者,您也可以在 Metrics Explorer 中建立這張圖表,步驟如下:

在 Metrics Explorer 中,依據作業類型建立 CPU 使用率圖表

  1. 在 Google Cloud 控制台中,選取「Monitoring」,或使用下列按鈕:

    前往「Monitoring」

  2. 在導覽窗格中選取「Metrics Explorer」
  3. 在「Find resource type and metric」欄位中輸入 spanner.googleapis.com/instance/cpu/utilization_by_operation_type 值,然後選取方塊下方顯示的資料列。
  4. 在「Filter」欄位中輸入值 instance_id,然後輸入要檢查的執行個體 ID,並按一下「> 套用」
  5. 在「Group By」欄位中,從下拉式清單中選取「category」。圖表會顯示使用者工作的 CPU 使用率,並依作業類型或類別分組。

雖然前一個章節的 依優先順序劃分的 CPU 使用率指標有助於判斷使用者或系統工作是否導致 CPU 資源使用率上升,但您可以透過 依作業類型劃分的 CPU 使用率指標,進一步瞭解導致 CPU 使用率上升的使用者啟動作業類型。

找出導致 CPU 使用率上升的使用者要求

如要判斷哪個特定使用者要求導致 圖 2 所示 executesql_select_readonly 作業類型圖表中的 CPU 使用率激增,您可以使用內建的自省統計資料表格,進一步瞭解問題。

請參考下表,根據導致 CPU 使用率偏高的作業類型,判斷要查詢哪個統計資料表。

作業類型 查詢 讀取 交易
read_readonly
read_readwrite
read_withpartitiontoken
executesql_select_readonly
executesql_select_withpartitiontoken
executesql_select_readwrite
executesql_dml_readwrite
executesql_dml_partitioned
beginorcommit

舉例來說,如果 read_withpartitiontoken 有問題,請使用讀取統計資料進行疑難排解。

在這種情況下,executesql_select_readonly 作業似乎是導致 CPU 使用率增加的原因。根據上表,您應該查看查詢統計資料,找出哪些查詢耗用大量資源、執行頻率高或掃描大量資料。

如要找出前一小時中 CPU 使用率最高的查詢,您可以在 query_stats_top_hour 統計資料表上執行下列查詢。

SELECT text,
       execution_count AS count,
       avg_latency_seconds AS latency,
       avg_cpu_seconds AS cpu,
       execution_count * avg_cpu_seconds AS total_cpu
FROM spanner_sys.query_stats_top_hour
WHERE interval_end =
  (SELECT MAX(interval_end)
   FROM spanner_sys.query_stats_top_hour)
ORDER BY total_cpu DESC;

輸出結果會顯示依 CPU 使用率排序的查詢。找出 CPU 使用率最高的查詢後,您可以嘗試下列選項進行調整。

  • 查看查詢執行計畫,找出可能導致 CPU 使用率過高的效率問題。

  • 查看查詢,確認是否遵循 SQL 最佳做法

  • 查看資料庫結構定義設計,並更新結構定義,以便更有效率地執行查詢。

  • 針對 Spanner 在間隔期間執行查詢的次數,建立基準。您可以使用這個基準,偵測並調查任何與正常行為的異常偏差原因。

如果您無法找出 CPU 密集查詢,請為執行個體新增運算資源。增加運算容量可提供更多 CPU 資源,讓 Spanner 處理更大量的工作負載。詳情請參閱「增加運算能力」。

後續步驟