高い CPU 使用率を調査する

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

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

Cloud Console には、Cloud Spanner 用のいくつかのモニタリング ツールが用意されており、インスタンスで最も重要な指標のステータスを確認できます。これらのうちの 1 つは CPU 使用率 - 合計と呼ばれるグラフです。このグラフは、合計 CPU 使用率をインスタンスの CPU リソースの割合(%)で表し、タスクの優先度とオペレーションの種類別に表示されます。タスクには、読み取り / 書き込みなどのユーザータスクと、コンパクションやインデックス バックフィルなどの自動バックグラウンド タスクを処理するシステムタスクの 2 種類があります。

図 1 は、[CPU 使用率 - 合計] グラフの例を示しています。

[CPU 使用率 - 合計] グラフの例

図 1:Cloud Console の Monitoring ダッシュボードの [CPU 使用率 - 合計] グラフ。

CPU 使用率が大幅に増加したというアラートを Cloud Monitoring から受信したとします。Cloud Console でインスタンスの [Monitoring] ダッシュボードを開き、Cloud Console で [CPU 使用率 - 合計] グラフを調べます。図 1 に示すように、優先度の高いユーザータスクによる CPU 使用率の増加を確認できます。次のステップでは、この CPU 使用率が増加している優先度の高いユーザー オペレーションを特定します。

CPU 使用率の急上昇の原因となっているユーザー オペレーションを特定する

図 1 の [CPU 使用率 - 合計] グラフは、優先度の高いユーザータスクが CPU 使用率が高くなっていることを示しています。

次に、Cloud Console の [オペレーション タイプ別の 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、データベースの作成、インスタンスの作成、セッション関連のオペレーション、内部の緊急性の高い処理オペレーションなどがあります。

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

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

図 2.Cloud Console の [オペレーション タイプ別の CPU 使用率] グラフ。

グラフの上部にある [優先度] メニューを使用すると、表示を特定の優先度に制限できます。各演算タイプまたはカテゴリが折れ線グラフでプロットされます。グラフの下のカテゴリは、各グラフを示しています。各グラフの表示と非表示を切り替えるには、各カテゴリ フィルタを選択します。

または、後述のように、Metrics Explorer でこのグラフを作成することもできます。

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 使用率の増加の原因がユーザータスクとシステムタスクのどちらかを判定する一方で、オペレーション タイプ別の 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 でより多くのワークロードを処理できるようになります。詳細については、コンピューティング容量の増加をご覧ください。

次のステップ