我用ECC购买了我的第一个系统,并试图了解它在Linux中警报和维护方面的可能性。具体来说,Debian Linux位于带有AMD Opteron 6386 SE CPU和三星M393B2G70QH0-YK0 DDR3 ECC的超微型H8SGL主板上。
我已经了解到,这是可能的擦洗 ECC,这听起来是一个极好的想法。ECC RAM通常可以修复1位错误和检测2位错误.清洗涉及定期读取RAM,以先发制人地修复1位错误,以免导致2位错误。
我还了解到Linux支持这一点,但是我在使用它时遇到了问题,所以我需要一些帮助才能开始并确定设置。
据我所知,Linux使用一个名为EDAC的子系统以及在/sys/devices/system/edac/下公开的控件来处理ECC。我可以在这里看到我的两个内存控制器(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文档,刷洗率是通过/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中尝试过不同的设置。在BIOS中有一个用于ECC配置的选项,但它们对从linux中可见的清除率没有任何影响:

现在,我正在尝试User设置,但是我真的看不到它们之间的任何区别。
发布于 2020-06-24 07:09:51
这正是控制设置的方式,但是内核中有一个错误,导致硬件的读出始终返回这个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
781440781440是由内存控制器mc0每秒擦除的字节数,从请求的1000000量化到最接近的可能值。
https://unix.stackexchange.com/questions/593060
复制相似问题