我最近开始研究具有 NUMA 节点的系统,并注意到一些奇怪的事情。
/proc/meminfo
显示系统已128461 MB
[root@nfvis node]# head -n4 /proc/meminfo
MemTotal: 131544388 kB
MemFree: 334016 kB
MemAvailable: 49968 kB
Buffers: 4296 kB
该系统有两个 NUMA 节点,以下是各节点的内存分布:
[root@nfvis node]# head -n4 node0/meminfo
Node 0 MemTotal: 66751388 kB
Node 0 MemFree: 308952 kB
Node 0 MemUsed: 66442436 kB
Node 0 Active: 309552 kB
[root@nfvis node]# head -n4 node1/meminfo
Node 1 MemTotal: 67108864 kB
Node 1 MemFree: 22872 kB
Node 1 MemUsed: 67085992 kB
Node 1 Active: 0 kB
显然node0
显示65186 MB
并node1
显示65536 MB
,加起来为130722 MB
。我无法理解系统如何丢失2261 MB
内存。如果有人能给我指明正确的方向,那将非常有帮助。
答案1
预计会出现一些小差异,因为您无法冻结整个系统,然后读取彼此一致的数字。即使您可以冻结系统,也可能会阻止某些进程更新您想要读取的相同文件。
以下答案更好地解释了帖子中的问题
Linux /proc/meminfo 和 /sys/devices/system/node/nodex/meminfo 之间的关系。
proc 的代码在 中
fs/proc/meminfo.c
,而 sysfs 文件的代码在 中drivers/base/node.c
。比较它们可能会给你一些提示。请注意,你可能会数字加起来永远达不到 100%,因为您无法自动读取所有文件的内容,所以在读取时值会发生变化。
这两种方法报告的总 RAM 似乎也不一致。对此的一个解释是,它
free_init_mem
似乎不了解 NUMA,并且会增加total_ram_pages
但不进行任何 NUMA 核算。
虽然这个答案可以追溯到 2011 年,并且从那时起 Linux 中的 NUMA 支持已经有了很大的改进,但是读取在阅读时发生变化的数字意味着您应该将这些数字视为近似值。
我还怀疑在计算这些值时可能没有考虑到少量的系统 RAM。