使用核心傾印分析沒有回應的虛擬機器 (VM) 執行個體原因。
如要在 Compute Engine 上收集核心傾印,您必須將 VM 設定為接收不可遮蔽中斷 (NMI) 信號,然後執行 SendDiagnosticInterrupt 指令,在作業系統中觸發核心錯誤或藍色畫面。核心錯誤或藍色畫面會啟動訪客作業系統的核心傾印收集作業。這些核心傾印檔可用於偵錯,特別是在難以重現的情況下,例如核心凍結。
事前準備
- 傳送 NMI 信號會計入預設的「查詢」API 配額。詳情請參閱「API 使用頻率限制」一文。
-
如果尚未設定驗證,請先完成設定。
驗證可確認您的身分,以便存取 Google Cloud 服務和 API。如要從本機開發環境執行程式碼或範例,請選取下列其中一個選項,向 Compute Engine 進行驗證:
選取這個頁面上的分頁,瞭解如何使用範例:
gcloud
-
安裝 Google Cloud CLI。 完成後,執行下列指令來初始化 Google Cloud CLI:
gcloud init若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
-
- 設定預設地區和區域。
REST
如要在本機開發環境中使用本頁的 REST API 範例,請使用您提供給 gcloud CLI 的憑證。
安裝 Google Cloud CLI。
若您採用的是外部識別資訊提供者 (IdP),請先使用聯合身分登入 gcloud CLI。
詳情請參閱 Google Cloud 驗證說明文件中的「使用 REST 進行驗證」。
必要的角色
為確保使用者或服務帳戶具備將 NMI 信號傳送至 VM 的必要權限,請要求系統管理員在專案中,將「Compute 執行個體管理員 (v1)」 (roles/compute.instanceAdmin.v1) IAM 角色授予使用者或服務帳戶。如要進一步瞭解如何授予角色,請參閱「管理專案、資料夾和組織的存取權」。
這個預先定義的角色具備 compute.instances.sendDiagnosticInterrupt 權限,可將 NMI 信號傳送至 VM。
管理員或許還可透過自訂角色或其他預先定義的角色,將這項權限授予使用者或服務帳戶。
總覽
如要使用核心傾印檔案偵錯沒有回應的 VM 或安全問題,請完成下列步驟:
限制
如果 VM 已啟用安全啟動功能,您必須先停用這項功能,才能傳送 NMI 中斷信號。如需相關操作說明,請參閱「在 VM 執行個體上修改 Shielded VM 選項」。
設定 VM
VM 收到 NMI 中斷訊號時的反應,取決於 VM 的作業系統設定。
每個作業系統都會將核心傾印記錄寫入不同位置。舉例來說,在 Ubuntu 作業系統中,當機傾印檔案預設會儲存至 /var/crash/。
如要設定客體 OS 在收到 NMI 信號時產生當機 dump 檔,請參閱支援作業系統的說明文件。
| 作業系統 | 操作說明連結 | 其他注意事項 |
|---|---|---|
| Ubuntu | Ubuntu:核心當機 dump 檔 | 如果是 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 | 產生核心或完整當機 dump 檔 | 除非 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
更改下列內容:
VM_NAME:要收集核心傾印的 VM 執行個體 ID 或名稱ZONE:VM 所在的可用區
輸出結果會與下列內容相似:
<Empty Response>
如需完整的輸出清單,請參閱本文下一節的「NMI 指令回應」。
REST
選用。如果沒有可用的 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 指令回應」。
NMI 指令回應
嘗試傳送 NMI 信號時,系統會傳回下列其中一項回應。
| 狀態 | 內文 | 附註 |
|---|---|---|
| 成功 | <Empty Response> |
SUCCESS 顯示 NMI 訊號已傳送至作業系統。這項作業無法保證系統會收集核心傾印,也無法保證 VM 會關閉或重新啟動。這些行為取決於作業系統設定。 |
| 不通過 | UNSUPPORTED_OPERATION
|
當作業系統無法接收 NMI 信號時,就會發生這種情況。發生這種情況的原因有很多,常見情況是 VM 正在即時遷移,或是 VM 未正確設定,無法接收 NMI 訊號。 如要解決這個問題,請嘗試下列做法:
|
| 不通過 | Required 'compute.instances.sendDiagnosticInterrupt' permission for [..]
|
提出要求的使用者權限不足,因此指令失敗。 如要解決這個問題,請指派包含 compute.instances.sendDiagnosticInterrupt 權限的角色給使用者。 |
查看核心傾印
在作業系統的設定或預設位置中,查看當機 dump 檔。
舉例來說,在 Ubuntu 作業系統中,當機 dump 檔預設會儲存至 /var/crash/。