本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。
在Linux kernel中使用kdump,可以在发生内核Panic等异常时保存执行现场,捕获内存中的信息,从而协助开发者或管理员分析崩溃原因。使用kdump功能时,需要在系统启动时预留一定量内存,且这部分内存不会被常规进程使用。您可以通过在内核启动参数中增加crashkernel参数来自定义预留内存大小。本文将介绍在Alibaba Cloud Linux 3 64位 ARM架构下的kdump内存访问性能优化及使用说明。
使用限制
如需使用kdump内存访问性能优化功能,您的实例镜像必须满足以下要求:
实例使用的操作系统必须为Alibaba Cloud Linux 3 64位 ARM版。
内核版本必须为5.10.134-17.2及以上版本。
优化介绍
问题描述
在Alibaba Cloud Linux 3 64位 ARM版本的内核环境中,如果在支持DMA和DMA32的内存区域内预留crashkernel内存,将会导致内核中的线性映射区使用小页映射。这一机制旨在通过/sys/kernel/kexec_crash_size
动态调整crashkernel内存大小,但会导致基于线性映射区地址访问内存时性能的降低。
优化说明
为避免上述原因导致的kdump内存访问性能问题,目前默认为kdump服务较早预留crashkernel内存,并尽可能建立大页映射,以提升使用线性映射地址访问内存的效率。该优化功能已默认开启,无需手动进行设置。
如何关闭kdump内存访问性能优化功能
如果您的业务场景不需要使用该内存访问性能优化功能,您可以按照以下步骤进行操作,以关闭kdump
内存访问性能优化功能。该操作仅关闭kdump内存访问优化功能,kdump服务不受影响。
运行以下命令,为内核启动参数中增加
defer_reserve_crashmem
参数,以关闭kdump
内存访问性能优化功能。sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --args="defer_reserve_crashmem"
说明如果关闭了kdump内存访问性能优化功能,想要再次启用该优化功能,可以运行以下命令
sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --remove-args="defer_reserve_crashmem"
,此命令将重新启用该优化功能。随后,请运行sudo reboot
命令重启实例,以使配置生效。运行以下命令,重启实例使配置生效。
警告重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。
sudo reboot
运行以下命令,查看内核启动命令是否已增加相应配置。
grep defer_reserve_crashmem /proc/cmdline
回显结果示例如下,表明内核启动参数添加成功。
常见问题
如何为kdump配置预留低地址段crashkernel内存地址
问题现象
在Alibaba Cloud Linux 3 64位 ARM版本中使用crashkernel功能时,发现预留的内存起始地址超过4 GB。
可能原因
kernel启动参数crashkernel中未指定预留的内存起始地址,导致选择的预留内存起始地址超过4 GB。
解决方案
如果您遇到上述问题,可以通过在设置crashkernel内存大小时增加offset参数,以指定从低地址段的起始地址预留内存空间,从而解决该问题。具体操作如下。
方式一:按偏移量方式设置offset
运行以下命令,为内核启动参数crashkernel增加offset参数。本示例中,预留内存大小设置为320M,起始地址设定为0x40000000。在实际使用中,您需根据自身情况进行相应替换。
sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --args="crashkernel=320M@1024M"
运行以下命令,重启实例使配置生效。
警告重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。
sudo reboot
运行以下命令,查看内核启动命令是否已增加相应配置,示例中使用步骤1中添加的
crashkernel=320M@1024M
作为关键字,在实际使用中,您需根据自身情况进行相应替换。grep "crashkernel=320M@1024M" /proc/cmdline
回显信息示例如下,表明内核启动参数添加成功。
方式二:按内存量方式设置offset
运行以下命令,为内核启动参数crashkernel增加offset参数,本示例中,依据内存大小区间设置不同的预留内存大小,起始地址设定为0x40000000。在实际使用中,您需根据自身情况进行相应替换。
sudo grubby --update-kernel="/boot/vmlinuz-$(uname -r)" --args="crashkernel=crashkernel=0M-2G:0M,2G-64G:256M,64G-:384M@1024M"
运行以下命令,重启实例使配置生效。
警告重启实例将导致您的实例暂停运行,这可能引发业务中断和数据丢失。因此,建议您在执行此操作之前备份关键数据,并选择在非业务高峰期进行。
sudo reboot
运行以下命令,查看内核启动命令是否已增加相应配置。本示例中使用步骤1中添加的
crashkernel=0M-2G:0M,2G-64G:256M,64G-:384M@1024M
作为关键字,在实际使用中,您需根据自身情况进行相应替换。grep "crashkernel=0M-2G:0M,2G-64G:256M,64G-:384M@1024M" /proc/cmdline
回显信息示例如下,表明内核启动参数添加成功。
相关文档
有关如何配置crashkernel,请参见crashkernel配置说明。