我想系统地调试内存问题。
我的系统设置如下:我有一个带有 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
可以列出为系统保留的内存块。