应直接读取/sys/devices/system/edac/mc/获取实时页级计数,该路径提供内核edac子系统持续累加的ce/ue错误值;定位具体出错页需结合dmesg中page:和offset:字段计算物理地址,并用rasdaemon或dmidecode交叉验证硬件位置。

直接读 /sys/devices/system/edac/mc/ 获取实时页级计数
内核 EDAC 子系统把每次可纠正(CE)和不可纠正(UE)错误都按内存控制器、csrow、dimm 累计到 sysfs,/sys/devices/system/edac/mc/ 是最接近硬件的原始数据源,不依赖日志轮转或用户态工具解析。
执行以下命令快速扫出所有非零错误计数:
dmesg | grep -i "edac\|mce\|ecc\|correctable\|uncorrectable"
但注意:dmesg 只记录事件发生时的快照,而 /sys/devices/system/edac/mc/mc*/csrow*/{ce,ue}_count 是持续累加值。真正要定位“哪一页出错”,得结合错误发生时的 page 和 offset 字段——这些只出现在 dmesg 日志里,例如:
EDAC MC0: 1 CE memory read error on CPU socket 0 channel 1 dimm 0 (csrow:2 page:0x12345678 offset:0x1000)
其中 page:0x12345678 就是物理页帧号(PFN),offset:0x1000 是页内偏移(4KB 对齐)。这个组合能唯一标识一个 4KB 内存页。
-
page值需转换为物理地址:物理地址 =page× 4096 +offset - 若
page为0x12345678,则对应物理地址是0x12345678000(左移 12 位)+0x1000=0x123456781000 - 该地址不能直接访问,但可用于交叉验证
dmidecode -t memory输出的 DIMM 地址范围,或喂给rasdaemon做映射分析
用 rasdaemon 解析结构化页错误事件
mcelog 已废弃,rasdaemon 是当前主流方案,它持续监听 MCE 和 EDAC 事件,并将原始信号转为带时间戳、物理地址、DIMM 标签的结构化记录。
先确认服务运行:
sudo systemctl is-active rasdaemon
再查最近的页级错误:
sudo ras-mc-ctl --errors --ce --limit=10
典型输出含 phys_addr、dimmslot、csrow、page 字段,比 dmesg 更易关联硬件位置。
- 若输出为空,检查
sudo journalctl -u rasdaemon -n 50是否报no MCE support—— 可能 BIOS 关闭了 MCE Reporting -
ras-mc-ctl --errors默认只显示过去 24 小时;加--since "2026-07-01"可查更早记录 - 关键字段
phys_addr是物理内存地址,不是虚拟地址,可直接用于dmidecode -t memory的地址范围比对
别信 edac-util -r,它只返回“最后一次”而非“具体页”
edac-util -r 容易误导人:它从 sysfs 读取的是“最后一次触发 CE/UE 的 csrow/dimm”,但不包含 page 或 offset,也不保证时间顺序——因为 sysfs 接口本身不保存历史上下文。
真正要查页错误,必须回溯 dmesg 或 rasdaemon 日志。常见误操作:
- 看到
edac-util -v显示某dimm0的ce_count在涨,就换条内存——但可能错误集中在某几个页,是颗粒老化而非整条故障 - 用
cat /sys/devices/system/edac/mc/mc0/dimm0/ce_count得到数字 123,却无法知道这 123 次分别发生在哪些页 - 忽略
dimm_label和实际物理槽位差异:某些厂商固件填的是CPU_SrcID#0_Channel#1_DIMM#0,但dmidecode -t memory的Locator字段才对应主板丝印(如A1)
BIOS 设置决定你能否看到页级信息
即使内核支持,若 BIOS 关闭关键选项,page 和 offset 字段会缺失或为 0。
进 BIOS 必查三项:
-
Memory Error Reporting:必须启用(部分 Dell/HP 命名为ECC Logging) -
Machine Check Exception (MCE):必须启用,否则rasdaemon拿不到底层寄存器数据 -
DRAM Patrol Scrubbing:建议禁用,它会主动读写内存做纠错,干扰真实错误定位
改完需重启,且首次启动后要等几分钟让 EDAC 驱动完成初始化(dmesg | grep edac 应见 Giving out device to module)。
页错误不是孤立事件。单次 CE 可能无害,但同一 page 反复报错(比如 1 小时内出现 5 次),基本锁定该物理页对应的内存颗粒失效——这时候换条内存才有意义。











