在弹性裸金属实例规格的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
阶段,块设备vda的pci_resource
资源分配失败,导致无法成功生成crash dump文件。造成该问题的根本原因是实例规格与操作系统不兼容。命令行回显结果示例如下图所示:
解决方案
您可以通过以下任一方式解决该问题:
方式一:自行升级操作系统内核至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
保留内存参数的操作说明如下:
打开/kdump-tools.cfg文件。
vim /etc/default/grub.d/kdump-tools.cfg
按i键进入编辑模式,将
crashkernel
参数修改为以下内容。GRUB_CMDLINE_LINUX_DEFAULT="$GRUB_CMDLINE_LINUX_DEFAULT crashkernel=384M-:256M"
修改完成后,按Esc键,输入
:wq
并按Enter键,保存退出文件。更新GRUB配置。
update-grub
重启ECS实例使配置生效。
建议您在业务低峰时段重启ECS实例,减少因实例重启对实际业务运行产生的影响。重启ECS实例的具体操作,请参见重启实例。