Linux 可以清理内存吗?

Wax*_*ead 11 memory linux redundancy

Linux 是否有“清理”内存的机制?例如,测试内存并将区域标记为脏,如果它们出现故障,以便即使安装了坏的内存芯片,系统也可以继续“安全”运行?!

hai*_*img 7

这实际上是一个坏主意。无法在快速扫描中可靠地测试内存。这就是像 memtest86 这样的软件使用具有不同位模式的多遍来测试内存的原因。解决方案:

  1. memtest86测试内存,最好是长时间测试,让它运行一夜,会需要很长时间。

  2. 如果检测到坏内存,使用memmap 内核参数强制内核不使用该内存:

   memmap=nn[KMG]$ss[KMG]
            [KNL,ACPI] 将特定内存标记为保留。
            要使用的内存区域,从 ss 到 ss+nn。
            示例:从 0x18690000-0x1869ffff 中排除内存
                     memmap=64K$0x18690000
                     或者
                     memmap=0x10000$0x18690000

此外,您可以使用 ECC 内存,它会自动纠正 1 位错误并自动检测内存中的 2 位错误(如果发生不可纠正的内存问题,您将从内核获得日志消息)


Cim*_*ali 3

答案是肯定的,而且是透明完成的(前提是您有 ECC 内存来检测错误,并且您的内核版本至少为 2.6.30 才能继续安全运行)。

基本上,每次从处理器读取数据时都会检查您的内存,并定期清理*,以检查与纠错码 (ECC) 的一致性。如果发生错误,您会收到机器检查异常,然后由 mcelog ( http://www.mcelog.org/ )记录并捕获该异常。

如果您的错误是可纠正的,则会增加“漏桶”计数器,这会导致经常发生故障的物理 DIMM 无法透明地由另一根替换。因此,您的内存页面被复制到新位置,您的虚拟内存地址被更新以指向新页面,并且旧页面被操作系统标记为不再使用。

这在 Linux 上称为“软离线”(在 Solaris 上称为“内存页退役”,我不知道其他操作系统是否如此)。

但是,如果您的错误不可纠正,则会发生所谓的“硬脱机”,即您的内存页面将从正常操作系统内存管理中删除,并且您的应用程序被终止(注意:通过一些可捕获的 SIGBUS 信号告诉您在哪里)错误发生了,但不关心并尝试捕获它的情况很少见)。如果您的内存页是从文件映射的并且是干净的,则操作系统还可以在另一个物理位置透明地重新加载它,而不是终止进程。

您可以阅读有关 mcelog 的更多内容,其中有很多配置选项,您可以获得要触发的其他行为、选项以及有关要阅读的内容以及如何确保 mcelog 在您的系统上运行的其他线索。


* 清理或“巡检清理”包括读取内存、根据 ECC 检查错误,并在发现错误时用更正的内存字覆盖。术语“巡检清理”用于反对在内存读取错误时覆盖不正确的数据,有时称为“需求清理”。清理是一个可以启用的硬件过程,通常通过 BIOS 启用。