我购买了第一个带有 ECC RAM 的系统,并尝试了解它在 Linux 中进行警报和维护的可能性。再具体一点,Debian Linux在一个超微H8SGL主板带有一个AMD 皓龙 6386 SE中央处理器和三星 M393B2G70QH0-YK0DDR3 ECC 内存。
我了解到可以擦洗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
我还可以看到 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
现在我想启用擦洗。根据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
挖得这么深之后,我错过了什么?
BIOS ECC 配置
我还尝试过 BIOS 中的不同设置。 BIOS 中有一个用于 ECC 配置的选项,但它们对 linux 可见的清理速率没有任何影响:
现在我正在尝试User
设置,但我真的看不出它们之间有什么区别。
答案1
这是一个内核错误
这正是控制设置的方式,但内核中存在一个错误,导致该 CPU 的硬件读数始终返回 0。
A修补修复它已经排队,但我不知道它什么时候会渗透到主内核中。当发生这种情况时我可能会更新答案。
应用补丁后,问题中使用的命令的输出为:
# echo 1000000 >/sys/devices/system/edac/mc/mc0/sdram_scrub_rate
# echo $?
0
# cat /sys/devices/system/edac/mc/mc0/sdram_scrub_rate
781440
mc0
781440 是内存控制器每秒清理的字节数,已量化为与请求的 1000000 最接近的可能值。