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

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

我购买了第一个带有 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

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

相关内容