【Linux】free命令查看内存和实际物理内存有差异问题分析

本文详细解释了系统内存管理中kdump预留的内存情况,通过实例说明了如何通过调整crashkernel配置来释放更多内存。关键信息包括内存初始化保留、kdump大小、内存释放过程以及减少kdump预留以提升系统内存的实践操作。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

kdump问题

  1. 系统启动时会初始化相关设备,该过程会占用内存,内核启动时,也会占用一部分的内存。
  2. free -t命令查询的是云服务器的可用内存,dmidecode -t memory 命令查询的是实际硬件内存大小,因此,使用 free -m 命令查询到的内存大小比实际的要小一些,属于正常情况。

举例:

  1. 先通过free命令核实当前系统的内存大小

                  total        used        free      shared  buff/cache   available
    Mem:       1882192    	  109020      1550376     504   222796    1626632
    Swap:      0        0    0
    
  2. 通过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)
  1. 可以看到在内核加载过程中,系统分配的可供用户使用内存为 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 中已经包含了内核初始化完成后会被释放出来的内存

  2. 通过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

评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值