因此,我有一个带有 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 是所有用户 + 内核分配不再符合数据。