使用核心转储分析虚拟机 (VM) 实例无响应的原因。
如需在 Compute Engine 上收集核心转储,您必须将虚拟机配置为接收不可屏蔽中断 (NMI) 信号,然后运行 SendDiagnosticInterrupt
命令以提示操作系统中的内核崩溃或蓝屏。内核崩溃或蓝屏会使客机操作系统启动核心转储收集。然后,这些核心转储可用于调试,尤其是在难以重现的场景(如内核冻结)下。
准备工作
- 发送 NMI 信号会计入默认的 Queries API 配额。如需了解详情,请参阅 API 速率限制。
-
如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。
Select the tab for how you plan to use the samples on this page:
-
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
- Set a default region and zone.
REST
如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。
Install the Google Cloud CLI, then initialize it by running the following command:
gcloud init
如需了解详情,请参阅 Google Cloud 身份验证文档中的使用 REST 时进行身份验证。
-
所需的角色
如需确保您的用户或服务账号拥有向虚拟机发送 NMI 信号的必要权限,请要求您的管理员为您的用户或服务账号授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1
) IAM 角色。如需详细了解如何授予角色,请参阅管理对项目、文件夹和组织的访问权限。
此预定义角色可提供将 NMI 信号发送到虚拟机所需的 compute.instances.sendDiagnosticInterrupt
权限。
您的管理员也可以使用自定义角色或其他预定义角色为您的用户或服务账号授予此权限。
概览
要使用核心转储来帮助调试无响应的虚拟机或安全问题,您需要完成以下步骤:
限制
对于启用了安全启动的虚拟机,您必须在发送 NMI 中断信号之前停用安全启动。如需了解相关说明,请参阅修改虚拟机实例的安全强化型虚拟机选项。
配置虚拟机
虚拟机收到 NMI 中断信号后的响应取决于虚拟机的操作系统配置。
每个操作系统都会将其核心转储日志写入不同位置。例如,在 Ubuntu 操作系统中,崩溃转储文件默认保存到 /var/crash/
。
如需将客机操作系统配置为在收到 NMI 信号时生成崩溃转储,请查看支持的操作系统的文档。
操作系统 | 相关说明的链接 | 补充说明 |
---|---|---|
Ubuntu | Ubuntu:内核崩溃转储 | 对于 Linux 虚拟机,您必须将内核配置为在收到 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 客户端虚拟机不会保留内存转储文件,除非它们是 AD 域的成员或满足以下条件:
如需了解详情,请参阅 Windows 7 中的内核转储存储和清理行为 |
发送 NMI 以生成核心转储
配置虚拟机后,您可以使用 Google Cloud CLI 或 REST 将 NMI 信号发送到虚拟机。
要发送 NMI 信号,请使用 instances send-diagnostic-interrupt
命令。
gcloud compute instances send-diagnostic-interruptVM_NAME \ --zone=ZONE
替换以下内容:
VM_NAME
:您要从中收集核心转储的虚拟机的实例 ID 或名称ZONE
:虚拟机所在的可用区
输出内容类似如下:
<Empty Response>
如需查看完整的输出列表,请参阅本文档中关于“NMI 命令响应”的下一部分。
可选。如果还没有 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
:要在其中创建虚拟机的项目的 IDZONE
:虚拟机所在的可用区VM_NAME
:您要从中收集核心转储的虚拟机的实例 ID 或名称API_KEY
:您的 API 密钥
输出内容类似如下:
<Empty Response>
如需查看完整的输出列表,请参阅本文档中关于“NMI 命令响应”的下一部分。
NMI 命令响应
当您尝试发送 NMI 信号时,系统会返回以下响应之一。
状态 | 正文 | 备注 |
---|---|---|
成功 | <Empty Response> |
SUCCESS 表示 NMI 信号已传递给操作系统。它不保证已收集核心转储,也不保证虚拟机会关机或重新启动。这些行为由操作系统配置决定。 |
FAIL | UNSUPPORTED_OPERATION
|
当操作系统无法接收 NMI 信号时,就会发生这种情况。造成这种情况的原因有多个。常见场景是虚拟机正在实时迁移,或者虚拟机未正确配置为接收 NMI 信号。 要解决此问题,您可以尝试以下操作:
|
FAIL | Required 'compute.instances.sendDiagnosticInterrupt' permission for [..]
|
发出请求的用户权限不足,因此命令失败。 要解决此问题,您可以向用户分配包含 compute.instances.sendDiagnosticInterrupt 权限的角色。 |
查看核心转储
在配置或默认的位置查看操作系统的崩溃转储文件。
例如,在 Ubuntu 操作系统中,崩溃转储文件默认保存到 /var/crash/
。