コアダンプを使用して、応答しない仮想マシン(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
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
- レジストリが
AlwaysKeepMemoryDump
を1
に設定する - ディスクの空き容量が 25 GB を超えている
VM_NAME
: コアダンプを収集する対象の VM のインスタンス ID または名前ZONE
: VM インスタンスが配置されているゾーン省略可。API キーを作成します(まだ作成していない場合)。API キーの作成方法については、API キーの作成をご覧ください。
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 を作成するプロジェクトの IDZONE
: VM インスタンスが配置されているゾーンVM_NAME
: コアダンプを収集する対象の VM のインスタンス ID または名前API_KEY
: 自分の API キー
出力は次のようになります。
<Empty Response>
その他の出力については、このドキュメントの次のセクション「NMI コマンド レスポンス」をご覧ください。
- VM が正しく構成されていることを確認します。VM を構成するをご覧ください。
- しばらく待ってから、
SendDiagnosticInterrupt
リクエストを再試行します。
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 またはセキュリティの問題をデバッグできるようにするには、次の手順を行う必要があります。
制限事項
セキュアブートが有効になっている 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 ドメインのメンバーであるか、次の条件を満たしている場合を除き、メモリダンプ ファイルを保持しません。
詳しくは、 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
次のように置き換えます。
出力は次のようになります。
<Empty Response>
その他の出力については、このドキュメントの次のセクション「NMI コマンド レスポンス」をご覧ください。
REST
NMI コマンド レスポンス
NMI 信号を送信しようとすると、次のいずれかのレスポンスが返されます。
状態 本文 注 SUCCESS <Empty Response>
SUCCESS
は、NMI 信号がオペレーティング システムに配信されたことを示します。コアダンプの収集や、VM のシャットダウンまたは再起動が保証されるわけではありません。これらの動作は、オペレーティング システムの構成によって決まります。FAIL UNSUPPORTED_OPERATION
これは、オペレーティング システムが NMI 信号を受信できない場合に発生します。これには複数の理由があります。よくあるシナリオは、VM がライブ マイグレーションされているか、VM が NMI 信号を受信するように構成されていない場合です。
この問題を解決するには、次のことを試してください。FAIL Required 'compute.instances.sendDiagnosticInterrupt' permission for [..]
リクエストを行うユーザーに十分な権限が付与されていないため、コマンドが失敗しました。
この問題を解決するには、compute.instances.sendDiagnosticInterrupt
権限を含むロールをユーザーに割り当てます。コアダンプを確認する
オペレーティング システムに構成した場所またはデフォルトの場所にあるクラッシュ ダンプファイルを確認します。
たとえば、Ubuntu オペレーティング システムのデフォルトでは、クラッシュ ダンプファイルは
/var/crash/
に保存されます。特に記載のない限り、このページのコンテンツはクリエイティブ・コモンズの表示 4.0 ライセンスにより使用許諾されます。コードサンプルは Apache 2.0 ライセンスにより使用許諾されます。詳しくは、Google Developers サイトのポリシーをご覧ください。Java は Oracle および関連会社の登録商標です。
最終更新日 2024-11-19 UTC。
-