高 CPU 使用率の調査

このページでは、CPU 使用率の指標およびグラフとその他のイントロスペクション ツールを使用して、データベース内の高 CPU 使用率を調査する方法について説明します。

システムタスクとユーザータスクのどちらが高 CPU 使用率の原因になっているかを特定

Cloud Console には、Cloud Spanner 用のいくつかのモニタリング ツールが用意されており、インスタンスで最も重要な指標のステータスを確認できます。このいずれかのグラフは CPU 使用率 - 高い優先度です。このグラフは、優先度の高いタスクの CPU 使用率を、シングルリージョン インスタンスとマルチリージョン インスタンスの両方について、推奨される最大 CPU 使用率に対して表しています。タスクには次の 2 種類があります。ユーザータスク(読み取り、書き込みなど)、システムタスク(コンパクションやバックフィルの圧縮など)。

このグラフに表示されているタスクタイプを区別するには:

  1. グラフの [その他のグラフ オプション] アイコンをクリックします。

  2. [Metrics Explorer で表示する] を選択します。

  3. Metrics Explorer で、[グループ条件] オプションに is_system を追加します。グラフに、システムタスクとユーザータスク別の CPU 使用率が表示されるようになります。

図 1 に、優先度の高いタスクの CPU 使用率のグラフの例を示します。

優先度の高いタスクの CPU 使用率のグラフの例

図 1:Cloud Console の Monitoring ダッシュボードの 優先度の高いタスクの CPU 使用率 グラフ。

Cloud Monitoring から、CPU 使用率が大幅に増加したというアラートを受け取ったとします。Cloud Console でインスタンスの [モニタリング] ダッシュボードを開き、Metrics Explorer で CPU 使用率 - 高い優先度のグラフを開いて確認します。図 1 に示すように、優先度の高い CPU 使用率が増加し、is_system の値を見ると、この急増がユーザータスクに起因するものであることがわかります。次のステップでは、この CPU 使用率の増加を引き起こしているユーザー オペレーションを特定します。

CPU 使用率の急上昇を引き起こしているユーザー オペレーションを特定する

図 1 の [CPU 使用率 - 高い優先度] グラフを見ると、優先度の高いユーザータスクが CPU 使用率が高くなる原因となっていることがわかります。

次に、Cloud Monitoring の Metrics Explorer を使用してグラフを作成し、オペレーション タイプ別の CPU 使用率の指標を調べます。このグラフには、優先度の高いユーザー開始型のオペレーションごとに CPU 使用率の内訳が表示されます。

ユーザー開始型のオペレーション操作とは

ユーザー開始オペレーションは、API リクエストによって開始されるオペレーションです。Cloud Spanner は、これらのリクエストをオペレーション タイプまたはカテゴリにグループ化し、各オペレーション タイプを [オペレーション タイプ別の CPU 使用率] グラフに表示できます。次の表に、各オペレーション タイプに含まれる API メソッドを示します。

オペレーション API メソッド 説明
read_readonly Read
StreamingRead
キールックアップとスキャンを使用してデータベースから行を取得する読み取りなどがあります。
read_readwrite Read
StreamingRead
読み取り / 書き込みトランザクション内の読み取りなどがあります。
read_withpartitiontoken Read
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
トランザクションの開始、commit、ロールバックなどがあります。
misc PartitionQuery
PartitionRead
GetSession
CreateSession
PartitionQuery、PartitionRead、データベースの作成、インスタンスの作成、セッション関連のオペレーション、内部の緊急性の高い処理オペレーションなどがあります。

Metrics Explorer でオペレーションのタイプごとに CPU 使用率のグラフを作成する

  1. Cloud Console で [Monitoring] を選択するか、次のボタンを使用します。

    [Monitoring] に移動

  2. ナビゲーション パネルで [Metrics Explorer] を選択します。
  3. [Find resource type and metric] フィールドに値「spanner.googleapis.com/instance/cpu/utilization_by_operation_type 」を入力し、ボックスの下に表示される行を選択します。
  4. [フィルタ] フィールドに値「instance_id」を入力し、確認するインスタンス ID を入力して、[>Apply] をクリックします。
  5. [グループ条件] フィールドでプルダウン リストから [category] を選択します。グラフには、ユーザータスクの CPU 使用率がオペレーション タイプ別またはカテゴリ別に表示されます。

以下は、オペレーション タイプ別の CPU 使用率の指標のグラフの例です。

オペレーション タイプ別の CPU 使用率グラフの例

図 2.Metrics Explorer の オペレーション タイプ別の 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 が問題である場合は、読み取り統計情報を使用してトラブルシューティングを行います。

このシナリオの場合、CPU 使用率の増加の原因は、executsql_select_readonly オペレーションにあると思われます。上記の表に基づいて、クエリ統計情報を確認し、コストが高いクエリ、頻繁に実行されるクエリ、大量のデータをスキャンするクエリを調べます。

それまでの 1 時間で 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 使用率の原因となっている可能性のある非効率なクエリを特定します。

  • クエリを確認して、Cloud Spanner に関する SQL のベスト プラクティスに従っていることを確認します。

  • データベースのスキーマ設計を見直し、クエリが効率的に処理されるようにスキーマを更新します。

  • Cloud Spanner が一定間隔でクエリを実行する回数のベースラインを設定します。ベースラインを使用すると、通常の動作からの予期しない逸脱の原因を検出して調査することができます。

CPU 使用率の高いクエリを検出できなかった場合は、インスタンスにコンピューティング容量を追加します。コンピューティング容量を追加すると、CPU リソースが増加し、Cloud Spanner でより多くのワークロードを処理できるようになります。詳細については、コンピューティング容量の増加をご覧ください。

次のステップ