高い CPU 使用率について調査する

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

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

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

図 1 に、CPU 使用率 - 合計グラフの例を示します。

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

図 1.Google Cloud コンソールの Monitoring ダッシュボードの [CPU 使用率 - 合計] グラフ。

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

Query Insights ダッシュボードを使用して、この指標とその他の指標を時系列で可視化できます。事前に構築されたダッシュボードは、CPU 使用率の急上昇を確認し、非効率的なクエリを特定する際に活用できます。

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

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

次に、Cloud コンソールの [オペレーション タイプ別の CPU 使用率] グラフを確認します。このグラフは、ユーザーが開始した優先度が高、中、低のオペレーションごとに CPU 使用率の内訳を示しています。

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

ユーザー開始オペレーションは、API リクエストによって開始されるオペレーションです。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.Google Cloud コンソールの [オペレーション タイプ別の CPU 使用率] グラフ。

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

または、次の手順で 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. [フィルタ] フィールドに値「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 使用率の増加の原因は、executesql_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 使用率の原因となっている可能性のある非効率なクエリを特定します。

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

  • データベースのスキーマ設計を確認し、スキーマを更新してクエリをより効率的にします。

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

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

次のステップ