找出物理内存映射

找出物理内存映射

我想系统地调试内存问题。

我的系统设置如下:我有一个带有 2 个 CPU(每个都有多个核心)的(物理)服务器。每个 CPU 都有 1 TiB RAM(16 个内存模块,每个模块 64 GiB)连接到其内存控制器。因此,系统总共有 2 TiB RAM。目前,我在该服务器上使用 Ubuntu 20.04 作为操作系统。

当我lsmem --output-all以 root 身份执行时,我得到以下输出:

RANGE                                  SIZE  STATE REMOVABLE    BLOCK NODE  ZONES
0x0000000000000000-0x00000000ffffffff    4G online       yes      0-1    0   None
0x0000000100000000-0x000000fcffffffff 1008G online       yes    2-505    0 Normal
0x0000010000000000-0x000001007fffffff    2G online       yes      512    0   None
0x0000010080000000-0x000001ffffffffff 1022G online       yes 513-1023    1 Normal
0x0000020000000000-0x000002007fffffff    2G online       yes     1024    1   None

Memory block size:         2G
Total online memory:       2T
Total offline memory:      0B

正如您所看到的,内核将内存“分割”为 2 GiB 的块,这在具有如此 RAM 量的系统上是可以预期的。然而,我觉得奇怪的是,只列出了 1019 个块(应该是 1024 个块)。节点 0 的 5 个块(10 GiB 内存)似乎丢失了。 (我还有其他具有 2 TiB 内存的服务器,并且我在它们上没有遇到这种行为。)

我想知道这 10 GiB 发生了什么。即使该内存被某些设备使用,在执行lsmem --output-all.事实上,cat /proc/iomem也没有列出丢失的内存块。就好像 10 GiB 根本不存在一样。

所以这是我的问题:有没有办法找出从块(如列出的lsmem --output-all)到物理内存(即RAM模块)的映射?这将非常有帮助,因为这样我就可以更改受影响的 RAM 模块,看看该模块是否存在物理问题。

我已经尝试过了仔细查看/sys/devices/system/edac/mc,我发现了内存控制器和内存等级,但我没有找到内存映射到哪些块。

答案1

总内存的一部分是为系统本身保留的。所以你在 Linux 上看到的可用内存就是剩余的内存。这 5 个块应该是系统保留的内存。

dmidecode --type memory可以列出您安装了多少物理内存。

sudo grep '^[^ ]' /proc/iomem可以列出为系统保留的内存块。

来源

相关内容