从 dmesg ECC 错误输出中识别物理内存插槽

从 dmesg ECC 错误输出中识别物理内存插槽

我有一台配备 768​​ GiB ECC DDR4 内存的机器。其中一个模块不稳定,需要更换:dmesg充满了如下条目:

    [Mar25 08:07] mce: [Hardware Error]: Machine check events logged
[  +0.000014] EDAC skx MC1: HANDLING MCE MEMORY ERROR
[  +0.000003] EDAC skx MC1: CPU 0: Machine Check Event: 0x0 Bank 8: 0xdc00008001010092
[  +0.000002] EDAC skx MC1: TSC 0x116da2b2e75b2
[  +0.000001] EDAC skx MC1: ADDR 0x2e9282d900
[  +0.000001] EDAC skx MC1: MISC 0x200801c091001086
[  +0.000004] EDAC skx MC1: PROCESSOR 0:0x50657 TIME 1616659657 SOCKET 0 APIC 0x0
[  +0.000013] EDAC MC1: 2 CE memory read error on CPU_SrcID#0_MC#1_Chan#2_DIMM#0 (channel:2 slot:0 page:0x2e9282d offset:0x900 grain:32 syndrome:0x0 -  OVERFLOW err_code:0x0101:0x0092 socket:0 imc:1 rank:1 bg:2 ba:2 row:0xfc0b col:0x40)

并且有可纠正的已恢复 ECC 错误:

$ edac-util --report=simple
mc0: Correctable errors:   0
mc0: Uncorrectable errors: 0
mc1: Correctable errors:   270
mc1: Uncorrectable errors: 0
mc2: Correctable errors:   0
mc2: Uncorrectable errors: 0
mc3: Correctable errors:   0
mc3: Uncorrectable errors: 0
Total CE: 270
Total UE: 0

虽然向dmidecode我展示了许多有关系统及其内存的精彩信息,我不明白之间的关系(逻辑)dmesg的输出中显示的地址和dmidecode(物理地址)。

具体来说,虽然看起来内核告诉我地址​​发生了错误0x289282d900,但这必须是一个逻辑地址,因为物理地址的上限低于该地址。我的系统拥有的最高内存映射物理地址是:

Handle 0x004F, DMI type 19, 31 bytes
Memory Array Mapped Address
        Starting Address: 0x09000000000
        Ending Address: 0x0BFFFFFFFFF
        Range Size: 192 GB
        Physical Array Handle: 0x004E
        Partition Width: 3

同样,有用的信息channel:2 slot:0确实帮助我缩小了需要更换的范围,但dmidecode没有列出任何完全没有通道——但它的全部输出有用地说明哪个物理地址范围对应于主板上的(标记的)插槽:

$ sudo dmidecode -t memory|grep -i channel
$

同样,老把戏也grep -i 'System RAM' /proc/iomem不起作用:

00000000-00000000 : System RAM
00000000-00000000 : System RAM
00000000-00000000 : System RAM
00000000-00000000 : System RAM
00000000-00000000 : System RAM
00000000-00000000 : System RAM

令人恼火的是,我的主板手册实际上并没有详细说明如何布局(实际上是numa节点!)。

我可以远程找出哪根物理内存条存在问题吗?

答案1

这行应该就是您所需要的:

[  +0.000013] EDAC MC1: 2 CE memory read error on CPU_SrcID#0_MC#1_Chan#2_DIMM#0 (channel:2 slot:0

要阅读这篇文章:

CPU_SrcID#0=(CPU0)MC#1=(Memory Controller 1

edac-util发布的列表显示

0-3)Chan#2_DIMM#0=(Would be C0 DIMM).

内存通道应从 0(A0/A1)、1(B0/B1)、2(C0/C1) 等开始。DIMM0 将是该通道中的主插槽。

应该能够找到相同的信息:

edac-util -v

报告 UE/CE。

答案2

由于存储体交错和映射,很难找出某个操作使用了哪个模块。

删除一半的模块,然后看看问题是否仍然存在如何?继续一分为二,直到找到罪魁祸首。为了加快搜索速度,运行(== boot into)内存测试86+测试时强制错误出现。许多 Linux 安装 DVD(例如 Ubuntu)都有一个可以轻松启动的 memtest86+ 映像。

相关内容