我有一台配备 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+ 映像。