Linux可以清理内存吗?


10

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

Answers:


2

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

基本上,每次从处理器读取时都会检查您的内存,并定期对其进行清理*,以检查与纠错码(ECC)的一致性。如果发生错误,您将获得计算机检查异常,然后由mcelog(http://www.mcelog.org/)记录并抓取异常。

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

在Linux上这称为“软脱机”(在Solaris上称为内存页面退役,我不知道其他操作系统)。

但是,如果错误无法纠正,则会发生所谓的“硬脱机”,即您的内存页已从常规操作系统的内存管理中删除,并且您的应用程序被杀死(注意:通过一些可捕获的SIGBUS信号告诉您在哪里)发生了错误,但很少有人在意并设法抓住它)。如果您的内存页是从文件映射并清理的,则操作系统也可以在另一个物理位置透明地重新加载它,而不用终止进程。

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


*清理或“巡逻清理”包括读取内存,针对ECC检查是否存在错误,以及在发现错误时用更正后的内存字覆盖。反对使用术语巡逻清理来覆盖有关内存读取错误的不正确数据,有时称为“需求清理”。清理是通常可以通过BIOS启用的硬件过程。


1
仅当您拥有更昂贵的ECC内存时才适用。
psusi 2014年

这适用于所有带ECC的存储器。无论是平价(但您无法纠正),SECDED,更昂贵的Chipkill或任何更新的产品。DDR1已经可以实现ECC,但是这完全取决于您使用的实际模型。传统上,“家庭”市场对弹性的需求较少,但是超级计算机已经为它们配备了20多年的经验-服务器介于两者之间。
Cimbali 2014年

1
我的意思是ECC内存比非ECC昂贵(因此,大多数人没有)。
psusi 2014年

1
那么“大多数人”是相当模糊的。正如我所说,在投资和权力上付出代价是否普遍取决于市场。我现在使用的普通戴尔笔记本电脑已经使用了2年(标准配置,没有特殊要求)。它越来越普遍,因为功能的小型化使DIMM对各种辐射更加敏感。
Cimbali 2014年

1
Cimbali,谁做“巡逻清理”(在具有ECC内存的系统上)-bios固件(可能在smm模式下,对于OS内核是透明的)或linux内核在某种软件模式下(巡逻清理哪个模块)?ECC内存未检查ecc总和;要检查ecc,必须读取数据(内存控制器中的ecc方案将检查和)。某些内存经常被读取(通过cpu上的常规程序),另一内存可能要数周才能被读取。巡逻擦洗将读取所有内存每天(英特尔)或每1-48小时做ECC校验- electronics.stackexchange.com/q/73546#comment911379_73573
osgx

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位错误(如果发生不可纠正的内存问题,您将从内核获取日志消息)


感谢您提供有关这些内核参数的提示。您是否认为您可以澄清为什么这是一个糟糕的主意,以及为什么不能使用与memtest86(+)相同的方法来检查内存块?我知道,更可靠的测试需要更多的CPU时间(一次也可能需要更大数量的ram内存),但是为什么这一定要成为阻碍?如果分散足够长的时间,CPU时间可能不是问题,而且多CPU越来越成为主流。
Waxhead 2011年

从技术上讲,如果在足够长的时间内完成操作,则有可能实现。但是这里的瓶颈不是CPU,而是内存总线,当然,您会“毒化” CPU的内存缓存。我不知道这样的内核模块,而且这个想法对我来说似乎非常脆弱(安排将重复的模式写到实时系统上的任意内存区域中,等等)
haimg 2011年

haimg:问题:VFS将管理此保留内存的分页吗?我认为它不能,因为它对它不可见。
杰伊D

1
@Waxhead内存清理通常是使用硬件在BIOS级别完成的。如果启用,则应找到巡逻擦洗和按需擦洗的选项。如果内存完整性对您来说很重要(如果您使用的是ECC内存,那么肯定会如此),那么通过启用这些选项而获得的较小性能损失就值得。
2013年

1
我认为在此处包含对badram内核模块的引用可能会很有趣。它按照您的建议使用memtest86,但没有限制内核使用坏的内存,而是将其分配给不使用的内核,有效地保证了内核和应用程序都不会运行到该内存中。
Cimbali

2

帖子和答案误解了问题。内存清理旨在防止可纠正的单比特错误变成不可纠正的双错误。清理器偶尔只是所有物理内存(强制高速缓存未命中)。如果有任何单个位错误,将对其进行纠正(并且纠正必须使用比较和交换来重写正确的值),从而清除错误。

否则,如果在已经有一个错误的单词中发生第二个错误,则整个单词将无法更正,并且操作系统将不得不做一些剧烈的事情。

清理很重要,因为如果没有清理,则被读取但未被写入的内存(如代码页)可能会随着时间的推移而累积错误。


当您将答案标记为答案时,您为什么认为答案未命中理解该问题?
戴夫

1
尽管戴夫(Dave)的答复,拉里(Larry)还是很正确,但答案/ does /误解了这个问题。该问题询问Linux是否可以进行内存清理,正如Larry仔细解释的那样,以防止ECC h / w检测并纠正的单位错误变成不可纠正的2位错误。答案是关于如何首先使用软件应用程序检测那些错误的。
2013年

我认为您误解了这里的目的。当然,您在有关擦除的描述中是正确的,但是,例如,如果您在非ecc ram上运行(非关键)文件服务器,并有CPU周期来节省它,那么早晚发现故障可能是个好主意。并将其标记为坏并知道它,而不是意识到坏的存储芯片。也许更好的措辞应该是内存验证/验证。也许从技术上讲不是擦洗,但是仍然是减少潜在的错误内存造成的损害的可行方法。
Waxhead 2014年

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.