如何在 Linux 中启用和验证 ECC RAM 清理?

pip*_*ipe 6 memory linux-kernel ecc

我购买了我的第一个带有 ECC RAM 的系统,并试图了解它在 Linux 中的警报和维护方面的可能性。具体来说,Debian LinuxSuper Micro H8SGL主板上,配备AMD Opteron 6386 SE CPU 和三星 M393B2G70QH0-YK0 DDR3 ECC RAM。

我了解到可以清理ECC RAM,这听起来是个好主意。ECC RAM 可以正常修复1 位错误并检测2 位错误。清理包括定期读取 RAM 以抢先修复 1 位错误,以免它们最终成为 2 位错误。

我还了解到 Linux 支持这一点,但是我在使用它时遇到了问题,所以我需要一些帮助来开始并弄清楚设置。

Linux EDAC 驱动程序

据我了解,Linux 使用名为 EDAC 的子系统来处理 ECC RAM,并且其控件在/sys/devices/system/edac/. 我可以在这里看到我的两个内存控制器(2 节点 NUMA):

# ls /sys/devices/system/edac/mc/
mc0  mc1  power  subsystem  uevent
Run Code Online (Sandbox Code Playgroud)

我还可以看到 EDAC 驱动程序以某种方式加载:

# edac-util --status
edac-util: EDAC drivers are loaded. 2 MCs detected
# lsmod | grep edac
amd64_edac_mod         36864  0
edac_mce_amd           28672  1 amd64_edac_mod
Run Code Online (Sandbox Code Playgroud)

现在我想启用擦洗。根据Linux ABI 文档,擦除率通过/sys/devices/system/edac/mc/mc*/sdram_scrub_rate文件公开,记录如下:

内存控制器使用的清理速率是通过将最小带宽(以字节/秒为单位)写入属性文件来设置的。该比率将被转换为至少给出指定比率的内部值。读取文件将返回实际使用的清理速率。如果配置失败或未执行内存清理,则属性文件的值为-1。

但是当我这样做时什么也没有发生。将合理的值(检查源代码CPU 文档时位于中间的某个位置)写入文件似乎可行,但0在读取文件时总是返回:

# cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate
0
# echo 1000000 >/sys/devices/system/edac/mc/mc0/sdram_scrub_rate
# echo $?
0
# cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate
0

Run Code Online (Sandbox Code Playgroud)

挖了这么深,我错过了什么?

BIOS ECC 配置

我也在 BIOS 中尝试了不同的设置。BIOS 中有一个用于 ECC 配置的选项,但它们对从 linux 可见的擦除率没有任何影响:

在此处输入图片说明

现在我正在尝试User设置,但我真的看不出它们之间有什么区别。

pip*_*ipe 5

这是一个内核错误

这正是控制设置的方式,但是内核中存在一个错误,导致从硬件读取的数据始终为该 CPU 返回 0。

修复它的补丁已排入队列,但我不知道它何时会渗透到主内核中。发生时我可能会更新答案。

应用补丁后,问题中使用的命令的输出为:

# echo 1000000 >/sys/devices/system/edac/mc/mc0/sdram_scrub_rate
# echo $?
0
# cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate
781440
Run Code Online (Sandbox Code Playgroud)

781440 是内存控制器mc0每秒清理的字节数,从请求的 1000000 量化为最接近的可能值。