Linux 中已提交/分配的内存小于已使用内存。这是怎么回事?

Linux 中已提交/分配的内存小于已使用内存。这是怎么回事?

因此,我有一个带有 Linux 内核 4.14.73 的系统,其中我使用来自 /proc/meminfo 的值来显示系统规格,包括已用内存和保留内存。一切都很顺利,直到我看到一些非常奇怪的事情:总已提交内存小于已用内存(或用 /proc/meminfo 术语来说 COMMITTED_AS < MEMTOTAL - MEMAVAILABLE)。以下是 /proc/meminfo 的输出:

# cat /proc/meminfo     
MemTotal:       32911616 kB
MemFree:        32322628 kB
MemAvailable:   32360768 kB
Buffers:            4604 kB
Cached:           304088 kB
SwapCached:            0 kB
Active:            83876 kB
Inactive:         263204 kB
Active(anon):      46680 kB
Inactive(anon):      152 kB
Active(file):      37196 kB
Inactive(file):   263052 kB
Unevictable:       83788 kB
Mlocked:           83788 kB
SwapTotal:             0 kB
SwapFree:              0 kB
Dirty:                 0 kB
Writeback:             0 kB
AnonPages:        122204 kB
Mapped:            22348 kB
Shmem:              1328 kB
Slab:              52696 kB
SReclaimable:      28548 kB
SUnreclaim:        24148 kB
KernelStack:        2896 kB
PageTables:         2348 kB
NFS_Unstable:          0 kB
Bounce:                0 kB
WritebackTmp:          0 kB
CommitLimit:    32911616 kB
Committed_AS:     366544 kB
VmallocTotal:   34359738367 
VmallocUsed:           0 kB
VmallocChunk:          0 kB
HugePages_Total:       0
HugePages_Free:        0
HugePages_Rsvd:        0
HugePages_Surp:        0
Hugepagesize:       2048 kB
DirectMap4k:       47004 kB
DirectMap2M:     4050944 kB
DirectMap1G:    29360128 kB

因此,这给了我约 538MB 的已用内存,但只有约 358MB 的已提交内存!系统中分配的总内存怎么可能小于已用内存?或者有人能指出我在这里做错了什么吗?

请就这里发生的事情提供任何指点,我将不胜感激!!

答案1

在 Linux 上,Committed_AS 是用户空间提交估计。 如果添加内核内容、Cached、Slab、KernelStack 和 PageTables,这将占“丢失”的几百 MB 的大部分。

程序不会使用所有分配空间。因此,内核会玩一些聪明的过度使用游戏,并希望如果每个人都用实际数据填充自己的空间,它不会破产。

在许多系统中,如果大部分内存都分配在用户空间中,Committed_AS 可以相对安全地接近 MemTotal。尽管远远超过它会导致页面调出和总体性能不佳。为了安全起见,我的容量规划目标是 Committed_AS 低于 MemTotal。

但该系统的内存利用率远低于该阈值,约为 2%。(利用率非常低。这里不存在容量问题。)用户空间分配仅比内核空间分配略多。因此,错误地假设 Committed_AS 是所有用户 + 内核分配不再符合数据。

相关内容