コアダンプの収集


コアダンプを使用して、応答しない仮想マシン(VM)インスタンスの原因を分析します。

Compute Engine でコアダンプを収集するには、Non-Maskable Interrupt(NMI)信号を受信するように VM を構成します。さらに、SendDiagnosticInterrupt コマンドを実行して、オペレーティング システムでカーネル パニックまたはブルー スクリーンが発生するようにします。カーネル パニック(またはブルー スクリーン)により、ゲスト オペレーティング システムがコアダンプの収集を開始します。これらのコアダンプは、特にカーネルのフリーズなど、再現困難なシナリオのデバッグに使用できます。

始める前に

  • NMI 信号の送信は、デフォルトの Queries API の割り当てにカウントされます。詳細については API レート制限をご覧ください。
  • まだ設定していない場合は、認証を設定します。認証とは、Google Cloud サービスと API にアクセスするために ID を確認するプロセスです。ローカル開発環境からコードまたはサンプルを実行するには、次のように Compute Engine に対する認証を行います。

    Select the tab for how you plan to use the samples on this page:

    gcloud

    1. Install the Google Cloud CLI, then initialize it by running the following command:

      gcloud init
    2. Set a default region and zone.
    3. REST

      このページの REST API サンプルをローカル開発環境で使用するには、gcloud CLI に指定した認証情報を使用します。

        Install the Google Cloud CLI, then initialize it by running the following command:

        gcloud init

      詳細については、Google Cloud 認証ドキュメントの REST を使用して認証するをご覧ください。

必要なロール

NMI 信号を VM に送信するために必要な権限がユーザーまたはサービス アカウントに付与されるように、プロジェクトに対する Compute インスタンス管理者(v1)roles/compute.instanceAdmin.v1)IAM ロールをユーザーまたはサービス アカウントに付与するよう管理者に依頼してください。ロールの付与の詳細については、アクセス権の管理をご覧ください。

この事前定義ロールには、NMI 信号を VM に送信するために必要な compute.instances.sendDiagnosticInterrupt 権限が含まれています。

管理者は、カスタムロールや他の事前定義ロールを使用して、この権限をユーザーまたはサービス アカウントに付与することもできます。

概要

コアダンプを使用して、応答しない VM またはセキュリティの問題をデバッグできるようにするには、次の手順を行う必要があります。

  1. コアダンプを生成するように VM を構成する
  2. NMI 信号を送信してコアダンプを生成する
  3. コアダンプを確認する

制限事項

セキュアブートが有効になっている VM では、NMI 割り込み信号を送信する前に、セキュアブートを無効にする必要があります。手順については、VM インスタンス上の Shielded VM オプションの変更をご覧ください。

VM を構成する

NMI 割り込み信号の受信に対する VM のレスポンスは、VM のオペレーティング システム構成によって異なります。

オペレーティング システムによってコアダンプのログの作成場所が異なります。たとえば、Ubuntu オペレーティング システムのデフォルトでは、クラッシュ ダンプファイルは /var/crash/ に保存されます。

NMI 信号の受信時にクラッシュ ダンプを生成するようにゲスト OS を構成する方法については、サポートされているオペレーティング システムのドキュメントをご覧ください。

オペレーティング システム 手順(リンク) その他の情報
Ubuntu Ubuntu: カーネル クラッシュ ダンプ Linux VM では、NMI 割り込み信号を受信したときにカーネルがクラッシュするように構成する必要があります。

カーネルがクラッシュするように構成するには、構成ファイルに次の行を追加します。
kernel.unknown_nmi_panic=1
SUSE Linux Enterprise Server(SLES) カーネル コアダンプの分析用に Crashkernel メモリを構成する
Red Hat Enterprise Linux(RHEL) 以下の両方のドキュメントを使用してください。
Container-Optimized OS(COS) GCE COS インスタンスでカーネル クラッシュ ダンプを有効にする NMI シグナルを使用した kdump 生成は、COS 93 以降でのみサポートされています。
Windows カーネルを生成するか、クラッシュ ダンプを完了する

Windows クライアント VM は、AD ドメインのメンバーであるか、次の条件を満たしている場合を除き、メモリダンプ ファイルを保持しません。

  • レジストリが AlwaysKeepMemoryDump1 に設定する
  • ディスクの空き容量が 25 GB を超えている

詳しくは、 Windows 7 のカーネルダンプ ストレージとクリーンアップの動作をご覧ください。

NMI を送信してコアダンプを生成する

VM を構成したら、Google Cloud CLI または REST を使用して、NMI 信号を VM に送信できます。

gcloud

NMI 信号を送信するには、instances send-diagnostic-interrupt コマンドを使用します。

gcloud compute instances send-diagnostic-interrupt VM_NAME \
    --zone=ZONE

次のように置き換えます。

  • VM_NAME: コアダンプを収集する対象の VM のインスタンス ID または名前
  • ZONE: VM インスタンスが配置されているゾーン

出力は次のようになります。

<Empty Response>

その他の出力については、このドキュメントの次のセクション「NMI コマンド レスポンス」をご覧ください。

REST

  1. 省略可。API キーを作成します(まだ作成していない場合)。API キーの作成方法については、API キーの作成をご覧ください。

  2. NMI 信号を送信するには、sendDiagnosticInterrupt メソッドPOST リクエストを送信します。

    POST https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY
    

    たとえば、次のように curl コマンドを使用してリクエストを作成できます。

    curl --request POST 'https://compute.googleapis.com/compute/v1/projects/PROJECT_ID/zones/ZONE/instances/VM_NAME/sendDiagnosticInterrupt?key=API_KEY' \
      --header 'Authorization: Bearer $(gcloud auth print-access-token)' \
      --header 'Accept: application/json' \
      --compressed
    

    次のように置き換えます。

    • PROJECT_ID: VM を作成するプロジェクトの ID
    • ZONE: VM インスタンスが配置されているゾーン
    • VM_NAME: コアダンプを収集する対象の VM のインスタンス ID または名前
    • API_KEY: 自分の API キー

    出力は次のようになります。

    <Empty Response>

    その他の出力については、このドキュメントの次のセクション「NMI コマンド レスポンス」をご覧ください。

NMI コマンド レスポンス

NMI 信号を送信しようとすると、次のいずれかのレスポンスが返されます。

状態 本文
SUCCESS <Empty Response> SUCCESS は、NMI 信号がオペレーティング システムに配信されたことを示します。コアダンプの収集や、VM のシャットダウンまたは再起動が保証されるわけではありません。これらの動作は、オペレーティング システムの構成によって決まります。
FAIL UNSUPPORTED_OPERATION これは、オペレーティング システムが NMI 信号を受信できない場合に発生します。これには複数の理由があります。よくあるシナリオは、VM がライブ マイグレーションされているか、VM が NMI 信号を受信するように構成されていない場合です。
この問題を解決するには、次のことを試してください。
  • VM が正しく構成されていることを確認します。VM を構成するをご覧ください。
  • しばらく待ってから、SendDiagnosticInterrupt リクエストを再試行します。
FAIL Required 'compute.instances.sendDiagnosticInterrupt' permission for [..] リクエストを行うユーザーに十分な権限が付与されていないため、コマンドが失敗しました。

この問題を解決するには、compute.instances.sendDiagnosticInterrupt 権限を含むロールをユーザーに割り当てます。

コアダンプを確認する

オペレーティング システムに構成した場所またはデフォルトの場所にあるクラッシュ ダンプファイルを確認します。

たとえば、Ubuntu オペレーティング システムのデフォルトでは、クラッシュ ダンプファイルは /var/crash/ に保存されます。