pip*_*ipe 6 memory linux-kernel ecc
我购买了我的第一个带有 ECC RAM 的系统,并试图了解它在 Linux 中的警报和维护方面的可能性。具体来说,Debian Linux在Super Micro H8SGL主板上,配备AMD Opteron 6386 SE CPU 和三星 M393B2G70QH0-YK0 DDR3 ECC RAM。
我了解到可以清理ECC RAM,这听起来是个好主意。ECC RAM 可以正常修复1 位错误并检测2 位错误。清理包括定期读取 RAM 以抢先修复 1 位错误,以免它们最终成为 2 位错误。
我还了解到 Linux 支持这一点,但是我在使用它时遇到了问题,所以我需要一些帮助来开始并弄清楚设置。
据我了解,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 中尝试了不同的设置。BIOS 中有一个用于 ECC 配置的选项,但它们对从 linux 可见的擦除率没有任何影响:
现在我正在尝试User
设置,但我真的看不出它们之间有什么区别。
这正是控制设置的方式,但是内核中存在一个错误,导致从硬件读取的数据始终为该 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 量化为最接近的可能值。