收集核心傾印


使用核心傾印分析虛擬機器 (VM) 執行個體沒有回應的原因。

如要在 Compute Engine 上收集核心傾印,您必須將 VM 設定為接收不可遮蔽中斷 (NMI) 信號,然後執行 SendDiagnosticInterrupt 指令,在作業系統中觸發核心恐慌或藍色畫面。核心恐慌或藍色畫面會啟動訪客作業系統的核心傾印收集作業。這些核心傾印檔可用於偵錯,特別是在難以重現的情況下,例如核心凍結。

事前準備

  • 傳送 NMI 信號會計入預設的「查詢」API 配額。詳情請參閱「API 使用頻率限制」一文。
  • 如果尚未設定驗證,請先完成設定。 驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,可以選取下列任一選項,向 Compute Engine 進行驗證:

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

    gcloud

    1. 安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    2. Set a default region and zone.

    REST

    如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。

      安裝 Google Cloud CLI。 安裝完成後,執行下列指令初始化 Google Cloud CLI:

      gcloud init

      如果您使用外部識別資訊提供者 (IdP),請先 使用聯合身分登入 gcloud CLI

    詳情請參閱 Google Cloud 驗證說明文件中的「Authenticate for using REST」。

必要的角色

如要確保使用者或服務帳戶具備將 NMI 信號傳送至 VM 的必要權限,請要求管理員授予使用者或服務帳戶專案的「Compute Instance 管理員 (v1)」 (roles/compute.instanceAdmin.v1) IAM 角色。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和機構的存取權」。

這個預先定義的角色具備 compute.instances.sendDiagnosticInterrupt 權限,可將 NMI 信號傳送至 VM。

管理員或許還可透過自訂角色或其他預先定義的角色,將這項權限授予使用者或服務帳戶。

總覽

如要使用核心傾印檔案偵錯沒有回應的 VM 或安全問題,請完成下列步驟:

  1. 設定 VM 來產生核心傾印
  2. 傳送 NMI 信號來產生核心傾印
  3. 查看核心傾印

限制

如果 VM 已啟用安全啟動功能,您必須先停用這項功能,才能傳送 NMI 中斷信號。如需相關操作說明,請參閱「在 VM 執行個體上修改受防護的 VM 選項」。

設定 VM

VM 收到 NMI 中斷訊號時的反應,取決於 VM 的作業系統設定。

每個作業系統都會將核心傾印記錄寫入不同位置。舉例來說,在 Ubuntu 作業系統中,系統預設會將當機傾印檔案儲存至 /var/crash/

如要設定客體 OS 在收到 NMI 信號時產生當機傾印,請參閱支援作業系統的說明文件。

作業系統 操作說明連結 其他注意事項
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 執行個體上啟用核心當機傾印 只有 COS 93 以上版本支援使用 NMI 信號產生 kdump。
Windows 產生核心或完整當機傾印

除非 Windows 用戶端 VM 是 AD 網域的成員,或符合下列條件,否則不會保留記憶體傾印檔案:

  • 登錄檔將 AlwaysKeepMemoryDump 設為 1
  • 磁碟可用空間超過 25 GB

詳情請參閱「 Windows 7 中的核心傾印儲存空間和清除行為」。

傳送 NMI 來產生核心傾印

設定 VM 後,您可以使用 Google Cloud CLIREST 將 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 信號時,系統會傳回下列其中一項回應。

狀態 內文 附註
成功 <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/