searchusermenu
  • 发布文章
  • 消息中心
点赞
收藏
评论
分享
原创

某资源池free显示的内存少于物理内存的说明

2025-08-15 10:29:48
3
0

客户反应某资源池7台主机通过free显示的total内存小于实际物理内存,一共有7台宿主机,有5台512G物理内存的宿主机,通过free显示内存为502G,2台384G物理内存的宿主机,通过free显示内存为375-376G。

以其中一台100.64.12.17为例说明:

通过dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range

命令查看物理内存情况:
image.png

图-1

一共16个32G内存,所以物理内存为16*32G= 512G=524288M

但是这些内存是系统所有软件公用,比如BIOS,intel SMM模式等使用到的内存,操作系统不能使用,通过dmesg查看系统启动日志可知,实际可供操作系统使用的内存为524148M,

比实际内存减少524288M - 523612M=676M(记为A)
image.png

图-2

由于系统使用了crashkernel配置

image.png

图-3

crashkernel会预留512M(记为B)内存给第二内核,以备第一系统crash时,第二系统生成coredump文件使用。这512M内存也不会计算到第一个系统内核的free的total内。

image.png

图-4

linux系统的所有物理内存都分为大小为4K的也进行管理的,管理结构体为struct page,此数据结构在ctyunos中大小为64bytes,相当于每4K物理内存需要64bytes进行管理,从而会有64bytes不能被使用。且此部分管理使用的内存没有计入free的total中。详细代码见free_area_init_core如下:

image.png

图-5

以512G内存算,struct page占用的内存为8G+(记为C)

还有一部分dma_reserve(记为D)保留内存,系统也不能使用,详细代码也在free_area_init_core函数中,如下所示:

image.png

图-6

dma保留内存数通过dmesg查看为:

image.png

图-7

dma保留23页内存。大小为23*4K= 92K

所以free中实际可用内存比真实物理内存减少量为:

524288M – A(676M)-B(512M)-C(8G+)-D(92K) 其大小小于514977M

由于实际struct page 在各个zone有对齐需求,其大小和free显示的大小基本符合(527222828K=514866M)。

image.png

图-8

这里大概还差111M,这和内核的内存管理方式有关,启动过程中内核会把所有可用内存(523612M)按地址区间放入memblock.memory数组中,把所有保留内存放入memblock.reserved数组中,reserved数组中的内存包括上诉提到的crashkernel, page struct,dma reserve使用的内存,但还包括内核启动过程中使用的其他数据和代码(init标识的代码数据也在reserved中,但启动完成后会回收init标识的代码数据页),这111M差异就是内核的数据和代码部分。memory和reserved在memblock中的具体分配请参见memblock_init_debugfs

image.png

图-9

memblock_init_debugfs需要修改内核配置开启,开启后可以通过/sys/kernel/debug/memblock中的memory,reserved文件查看具体分配情况。

通过zoneinfo也可用验证以上数据:
image.png

图-10

spanned 代表所有node的内存地址区间包括空洞的页数,present代表存在的物理内存页数,managed代表管理的页数也就是真正可用的内存数,

由于spanned是包括空洞的页数,参考意义不大,我们主要看present和managed。

present总数是3999+347264+66584576+67108864=134044703页

大小是134044703页 * 4K/页 = 536178812K = 523612M,和实际可用内存一致(见图-2)

managed总数是3976+ 215094+ 54558720+ 10976861+ 54560526+ 11490530= 131805707页

大小是131805707页*4K/页= 527222828K=514866M,和free显示内存一致(见图-8)

综上所述,在512G物理内存的宿主机上显示只有502G内存是正常的,实际是linux排除了保留内存,crash第二内核内存,管理物理内存的结构占用,dma保留内存后,在free中只显示了可以被系统使用的内存造成的。

0条评论
0 / 1000
刘强
8文章数
2粉丝数
刘强
8 文章 | 2 粉丝
原创

某资源池free显示的内存少于物理内存的说明

2025-08-15 10:29:48
3
0

客户反应某资源池7台主机通过free显示的total内存小于实际物理内存,一共有7台宿主机,有5台512G物理内存的宿主机,通过free显示内存为502G,2台384G物理内存的宿主机,通过free显示内存为375-376G。

以其中一台100.64.12.17为例说明:

通过dmidecode|grep -P -A5 "Memory\s+Device"|grep Size|grep -v Range

命令查看物理内存情况:
image.png

图-1

一共16个32G内存,所以物理内存为16*32G= 512G=524288M

但是这些内存是系统所有软件公用,比如BIOS,intel SMM模式等使用到的内存,操作系统不能使用,通过dmesg查看系统启动日志可知,实际可供操作系统使用的内存为524148M,

比实际内存减少524288M - 523612M=676M(记为A)
image.png

图-2

由于系统使用了crashkernel配置

image.png

图-3

crashkernel会预留512M(记为B)内存给第二内核,以备第一系统crash时,第二系统生成coredump文件使用。这512M内存也不会计算到第一个系统内核的free的total内。

image.png

图-4

linux系统的所有物理内存都分为大小为4K的也进行管理的,管理结构体为struct page,此数据结构在ctyunos中大小为64bytes,相当于每4K物理内存需要64bytes进行管理,从而会有64bytes不能被使用。且此部分管理使用的内存没有计入free的total中。详细代码见free_area_init_core如下:

image.png

图-5

以512G内存算,struct page占用的内存为8G+(记为C)

还有一部分dma_reserve(记为D)保留内存,系统也不能使用,详细代码也在free_area_init_core函数中,如下所示:

image.png

图-6

dma保留内存数通过dmesg查看为:

image.png

图-7

dma保留23页内存。大小为23*4K= 92K

所以free中实际可用内存比真实物理内存减少量为:

524288M – A(676M)-B(512M)-C(8G+)-D(92K) 其大小小于514977M

由于实际struct page 在各个zone有对齐需求,其大小和free显示的大小基本符合(527222828K=514866M)。

image.png

图-8

这里大概还差111M,这和内核的内存管理方式有关,启动过程中内核会把所有可用内存(523612M)按地址区间放入memblock.memory数组中,把所有保留内存放入memblock.reserved数组中,reserved数组中的内存包括上诉提到的crashkernel, page struct,dma reserve使用的内存,但还包括内核启动过程中使用的其他数据和代码(init标识的代码数据也在reserved中,但启动完成后会回收init标识的代码数据页),这111M差异就是内核的数据和代码部分。memory和reserved在memblock中的具体分配请参见memblock_init_debugfs

image.png

图-9

memblock_init_debugfs需要修改内核配置开启,开启后可以通过/sys/kernel/debug/memblock中的memory,reserved文件查看具体分配情况。

通过zoneinfo也可用验证以上数据:
image.png

图-10

spanned 代表所有node的内存地址区间包括空洞的页数,present代表存在的物理内存页数,managed代表管理的页数也就是真正可用的内存数,

由于spanned是包括空洞的页数,参考意义不大,我们主要看present和managed。

present总数是3999+347264+66584576+67108864=134044703页

大小是134044703页 * 4K/页 = 536178812K = 523612M,和实际可用内存一致(见图-2)

managed总数是3976+ 215094+ 54558720+ 10976861+ 54560526+ 11490530= 131805707页

大小是131805707页*4K/页= 527222828K=514866M,和free显示内存一致(见图-8)

综上所述,在512G物理内存的宿主机上显示只有502G内存是正常的,实际是linux排除了保留内存,crash第二内核内存,管理物理内存的结构占用,dma保留内存后,在free中只显示了可以被系统使用的内存造成的。

文章来自个人专栏
文章 | 订阅
0条评论
0 / 1000
请输入你的评论
0
0