收集核心转储


使用核心转储分析虚拟机 (VM) 实例无响应的原因。

如需在 Compute Engine 上收集核心转储,您必须将虚拟机配置为接收不可屏蔽中断 (NMI) 信号,然后运行 SendDiagnosticInterrupt 命令以提示操作系统中的内核崩溃或蓝屏。内核崩溃或蓝屏会使客机操作系统启动核心转储收集。然后,这些核心转储可用于调试,尤其是在难以重现的场景(如内核冻结)下。

准备工作

  • 发送 NMI 信号会计入默认的 Queries API 配额。如需了解详情,请参阅 API 速率限制
  • 如果您尚未设置身份验证,请进行设置。身份验证是通过其进行身份验证以访问 Google Cloud 服务和 API 的过程。如需从本地开发环境运行代码或示例,您可以按如下方式向 Compute Engine 进行身份验证。

    选择标签页以了解您打算如何使用本页面上的示例:

    gcloud

    1. 安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init
    2. 设置默认区域和可用区

    REST

    如需在本地开发环境中使用本页面上的 REST API 示例,请使用您提供给 gcloud CLI 的凭据。

      安装 Google Cloud CLI,然后通过运行以下命令初始化 Google Cloud CLI:

      gcloud init

所需的角色

如需确保您的用户或服务账号拥有向虚拟机发送 NMI 信号的必要权限,请要求您的管理员为您的用户或服务账号授予项目的 Compute Instance Admin (v1) (roles/compute.instanceAdmin.v1) IAM 角色。如需详细了解如何授予角色,请参阅管理访问权限

此预定义角色包含将 NMI 信号发送到虚拟机所需的 compute.instances.sendDiagnosticInterrupt 权限。

您的管理员也可以使用自定义角色或其他预定义角色为您的用户或服务账号授予此权限。

概览

要使用核心转储来帮助调试无响应的虚拟机或安全问题,您需要完成以下步骤:

  1. 配置虚拟机以生成核心转储
  2. 发送 NMI 信号以生成核心转储
  3. 查看核心转储

限制

对于启用了安全启动的虚拟机,您必须在发送 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 域的成员或满足以下条件:

  • 注册表会将 AlwaysKeepMemoryDump 设置为 1
  • 磁盘的可用空间超过 25 GB

如需了解详情,请参阅 Windows 7 中的内核转储存储和清理行为

发送 NMI 以生成核心转储

配置虚拟机后,您可以使用 Google Cloud CLIREST 将 NMI 信号发送到虚拟机。

gcloud

要发送 NMI 信号,请使用 instances send-diagnostic-interrupt 命令

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

替换以下内容:

  • VM_NAME:您要从中收集核心转储的虚拟机的实例 ID 或名称
  • ZONE:虚拟机所在的地区

输出内容类似如下:

<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:要在其中创建虚拟机的项目的 ID
    • ZONE:虚拟机所在的地区
    • VM_NAME:您要从中收集核心转储的虚拟机的实例 ID 或名称
    • API_KEY:您的 API 密钥

    输出内容类似如下:

    <Empty Response>

    如需查看完整的输出列表,请参阅本文档中关于“NMI 命令响应”的下一部分。

NMI 命令响应

当您尝试发送 NMI 信号时,系统会返回以下响应之一。

正文 备注
成功 <Empty Response> SUCCESS 表示 NMI 信号已传递给操作系统。它不保证已收集核心转储,也不保证虚拟机会关机或重新启动。这些行为由操作系统配置决定。
FAIL UNSUPPORTED_OPERATION 当操作系统无法接收 NMI 信号时,就会发生这种情况。造成这种情况的原因有多个。常见场景是虚拟机正在实时迁移,或者虚拟机未正确配置为接收 NMI 信号。
要解决此问题,您可以尝试以下操作:
  • 验证虚拟机已正确配置。请参阅配置虚拟机
  • 等待并重试 SendDiagnosticInterrupt 请求。
FAIL Required 'compute.instances.sendDiagnosticInterrupt' permission for [..] 发出请求的用户权限不足,因此命令失败。

要解决此问题,您可以向用户分配包含 compute.instances.sendDiagnosticInterrupt 权限的角色。

查看核心转储

在配置或默认的位置查看操作系统的崩溃转储文件。

例如,在 Ubuntu 操作系统中,崩溃转储文件默认保存到 /var/crash/