在弹性裸金属实例规格的ECS实例中,使用操作系统自带的Kdump服务生成crash dump文件可能会失败。本文主要介绍文件生成失败的原因以及解决方案。

问题现象

目前已知的问题场景说明如下,该类场景中的ECS实例在热插拔设备之后,不能成功生成crash dump文件。
  • 基于6代弹性裸金属实例规格族(包含ebmg6、ebmc6、ebmr6等实例规格)的ECS实例,在选用以下镜像时会出现crash dump文件生成失败的问题。
    • CentOS 8.3及以下版本
    • Ubuntu 16/18
    • Debian 10
    • 内核版本低于4.19.91-24.al7的Alibaba Cloud Linux 2
  • 基于7代弹性裸金属实例规格族(包含ebmg7、ebmc7、ebmr7等实例规格)的ECS实例,在选用Debian 10镜像时会出现crash dump文件生成失败的问题。

可能原因

ECS实例内Kdump服务在crashkernel阶段,块设备vdapci_resource资源分配失败,导致无法成功生成crash dump文件。造成该问题的根本原因是实例规格与操作系统不兼容。命令行回显结果示例如下图所示:Kdump

解决方案

您可以通过以下任一方式解决该问题:
  • 方式一:自行升级操作系统内核至5.10版本。
  • 方式二:为操作系统新增以下补丁,并重新构建内核(build kernel)。
    Benjamin Herrenschmidt (1):
      PCI: Don't auto-realloc if we're preserving firmware config
    
    Kelsey Skunberg (1):
      PCI: Make pci_hotplug_io_size, mem_size, and bus_size private
    
    Logan Gunthorpe (1):
      PCI: Don't disable bridge BARs when assigning bus resources
    
    Nicholas Johnson (2):
      PCI: Add "pci=hpmmiosize" and "pci=hpmmioprefsize" parameters
      PCI: Avoid double hpmemsize MMIO window assignment
    说明 部分内核版本已包含上述的部分补丁,您仍需要将未包含的补丁添加至内核中。例如,Debian 10的4.19内核版本已经包含了上述的第1、3个补丁,但还需要将第2、4、5个补丁添加至内核之后才可以使操作系统正常使用Kdump服务。

除了升级内核版本或为内核打补丁之外,您还需要注意:

对于Debian或Ubuntu操作系统内核,需要调整crashkernel保留内存的参数。推荐的参数设置如下:
crashkernel=0M-2G:0M,2G-8G:192M,8G-:256M
说明 部分操作系统镜像(例如Debian 10)需要调整保留内存为384 M或者512 M。如果保留内存的值未调大,则会导致Kdump服务在crashkernel阶段发生OOM,从而生成crash dump文件失败。
以大于384 M的内存需要保留256 M的配置为例,调整crashkernel保留内存参数的操作说明如下:
  1. 打开/kdump-tools.cfg文件。
    vim /etc/default/grub.d/kdump-tools.cfg
  2. i键进入编辑模式,将crashkernel参数修改为以下内容。
    GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:256M"
    修改完成后,按Esc键,输入:wq并按Enter键,保存退出文件。
  3. 更新GRUB配置。
    update-grub
  4. 重启ECS实例使配置生效。

    建议您在业务低峰时段重启ECS实例,减少因实例重启对实际业务运行产生的影响。重启ECS实例的具体操作,请参见重启实例