kdump问题
- 系统启动时会初始化相关设备,该过程会占用内存,内核启动时,也会占用一部分的内存。
free -t
命令查询的是云服务器的可用内存,dmidecode -t memory
命令查询的是实际硬件内存大小,因此,使用 free -m 命令查询到的内存大小比实际的要小一些,属于正常情况。
举例:
-
先通过
free
命令核实当前系统的内存大小total used free shared buff/cache available Mem: 1882192 109020 1550376 504 222796 1626632 Swap: 0 0 0
-
通过kernel log 查看内存初始化信息,核实内存预留情况
$ dmesg | grep available
[ 0.029654] [mem 0xa0000000-0xfeffbfff available for PCI devices
[ 0.062837] Memory: 1860324K/2097144K available (7764K kernel code, 5967k data, 1980K init, 392K absent, 236428K reserved)
-
可以看到在内核加载过程中,系统分配的可供用户使用内存为 1860324k【1882192-1860324=21868k】
加载过程中仍有21868k内存不知去向。继续分析:- kernel code :表示kernel的代码,属于reserved memory
- absent:表示不可用的物理内存大小。如有一部分物理内存被BIOS保留,且kernel也是不可用的
- reserved:包括【initrd】和【内核代码及数据】以及【kdump】等,其中内核代码和部分数据包含在下列统计值【kernel code、data】中
(查看kdump在grub.cfg配置crashkernel为auto的前提下,2G内存服务器默认预留了160M左右)
$ dmesg | grep crashkernel [ 0.000000] kexec_core: Reserving 161MB of low memory at 668MB for crashkernel (System low RAM: 2047MB) [ 0.000000] crashkernel reserved: 0x00000001ef400000 - 0x000000022f400000 (161 MB) [ 0.000000] Kernel command line: BOOT_IMAGE=/vmlinuz-4.19.90-2106.3.0.0095.up2.uel20.aarch64 root=/dev/mapper/uos-root ro rd.lvm.lv=uos/root rd.lvm.lv=uos/swap video=VGA-1:640x480-32@60me rhgb console=tty0 crashkernel=auto,high smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 video=efifb:off
解析:
-
第一行中 说了kdump占大小161M
-
第二行中 crashkernel reserver 大小是因为第三行代码中的crashkernel=auto来自动划分的
-
第三行代码中,主要看crashkernel 设定的是auto还是固定大小,还是没有这个参数
- crashkernel=auto,根据实际物理内存分配
- crashkernel=1024M ,将kdump大小设定为准确的1024M
- 没有crashkernel值,未开启kdump相关配置
-
data :表示kernel的可读可写的数据和只读数据大小,属于reserved memory
-
init :表示init code和init data,属于reserved memory,但引导完成之后会释放给 free memory
PS:这里 reserved 中已经包含了内核初始化完成后会被释放出来的内存
-
通过kernel log核实下内核初始化完成后被释放的内存
$ dmesg | grep Freeing [ 1.772411] Freeing SMP alternatives: 28k freed [ 1.710481] Freeing initrd memory: 18892k freed [ 1.879438] Freeing unused kernel memory:1980K freed [ 1.846545] Freeing unused kernel memory:416K freed [ 1.871231] Freeing unused kernel memory:552K freed
初始化后释放给用户的内存总和为:
28+18892+1980+416+552=21868k
21868+1860324=1882192k【最终系统完全启动后分配给用户的内存就为free查到的值】【如何最大限度增加系统内存】举例操作如下:
减小kdump预留内存(kdump是在系统崩溃、死锁或者死机的时候用来转储内存运行参数的一个工具和服务,在系统崩溃时,可进入capture当前运行信息的内核,提取其中的dump core文件,主要功能类似于windows dmp文件,用于分析系统崩溃原因,如无特殊需求不建议人为调整,可能导致kdump无法启动,系统崩溃无法准确确认原因)
调整方法如下:
vim /boot/grub2/grub.cfg
(UOS地址为/boot/efi/EFI/UnionTech/grub.cfg )
将 kdump 预留内存改为 0(即不为kdump预留内存。注:关闭kdump服务,取消其开机自启,系统仍然会按照grub.cfg设置为其分配内存)
linux /vmlinuz-4.19.90-2106.3.0.0095.up2.uel20.aarch64 root=/dev/mapper/uos-root ro single rd.lvm.lv=uos/root rd.lvm.lv=uos/swap video=VGA-1:640x480-32@60me rhgb console=tty0 crashkernel=0,high smmu.bypassdev=0x1000:0x17 smmu.bypassdev=0x1000:0x15 video=efifb:off console=tty0
查看系统内存增大【达到2000M】
total used free shared buff/cache available Mem: 2047056 84768 1813188 420 149100 1826632 Swap: 0 0 0
转自:https://blog.csdn.net/LgMizar/article/details/125702678