Answers:
答案是肯定的,而且是透明完成的(前提是您具有用于检测错误的ECC内存,并且您的内核版本至少为2.6.30,才能继续安全运行)。
基本上,每次从处理器读取时都会检查您的内存,并定期对其进行清理*,以检查与纠错码(ECC)的一致性。如果发生错误,您将获得计算机检查异常,然后由mcelog(http://www.mcelog.org/)记录并抓取异常。
如果您的错误是可以纠正的,则它会增加一个“泄漏桶”计数器,这会导致物理DIMM发生故障的次数过多,因此透明地替换为另一个DIMM。这样,您的内存页面将被复制到新位置,您的虚拟内存地址将更新为指向新页面,并且操作系统将旧页面标记为不再使用。
在Linux上这称为“软脱机”(在Solaris上称为内存页面退役,我不知道其他操作系统)。
但是,如果错误无法纠正,则会发生所谓的“硬脱机”,即您的内存页已从常规操作系统的内存管理中删除,并且您的应用程序被杀死(注意:通过一些可捕获的SIGBUS信号告诉您在哪里)发生了错误,但很少有人在意并设法抓住它)。如果您的内存页是从文件映射并清理的,则操作系统也可以在另一个物理位置透明地重新加载它,而不用终止进程。
您可以在mcelog上阅读更多信息,有很多配置选项,可以触发其他行为,选项以及有关阅读内容以及如何确保mcelog在系统上运行的其他线索。
*清理或“巡逻清理”包括读取内存,针对ECC检查是否存在错误,以及在发现错误时用更正后的内存字覆盖。反对使用术语巡逻清理来覆盖有关内存读取错误的不正确数据,有时称为“需求清理”。清理是通常可以通过BIOS启用的硬件过程。
这实际上是一个坏主意。无法快速扫描可靠地测试内存。这就是为什么像memtest86这样的软件使用具有不同位模式的多次传递来测试内存的原因。解:
使用memtest86来测试内存,最好是长时间测试,让它整夜运行,这会花费很长时间。
如果检测到内存不足,请使用memmap
内核参数强制内核不使用该内存:
memmap = nn [KMG] $ ss [KMG] [KNL,ACPI]将特定内存标记为保留。 要使用的内存区域,从ss到ss + nn。 示例:从0x18690000-0x1869ffff中排除内存 memmap = 64K $ 0x18690000 要么 memmap = 0x10000 $ 0x18690000
此外,您可以使用ECC内存,该内存将纠正1位错误并自动检测内存中的2位错误(如果发生不可纠正的内存问题,您将从内核获取日志消息)
帖子和答案误解了问题。内存清理旨在防止可纠正的单比特错误变成不可纠正的双错误。清理器偶尔只是所有物理内存(强制高速缓存未命中)。如果有任何单个位错误,将对其进行纠正(并且纠正必须使用比较和交换来重写正确的值),从而清除错误。
否则,如果在已经有一个错误的单词中发生第二个错误,则整个单词将无法更正,并且操作系统将不得不做一些剧烈的事情。
清理很重要,因为如果没有清理,则被读取但未被写入的内存(如代码页)可能会随着时间的推移而累积错误。
如果您具有ECC内存,则可能需要仔细查看https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-devices-edac。(我发现“ sdram_scrub_rate”特别有趣。)
(如果该链接在某个时候断开(实际上不应该),建议您下载适当的Linux文档并搜索“ scrub”。)