无 ECC 平台的软件内存位翻转检测
Posted
技术标签:
【中文标题】无 ECC 平台的软件内存位翻转检测【英文标题】:Software memory bit-flip detection for platforms without ECC 【发布时间】:2014-06-28 13:12:02 【问题描述】:大多数可用的桌面(廉价)x86 平台现在仍然不支持 ECC 内存 (Error Checking & Correction)。但是内存位翻转错误率仍在增长(not the best SO thread,Large scale CERN 2007 study "Data integrity":“他们的内存模块的位错误率为 10-12 ...观察到的错误率为比预期低 4 个数量级”;2009 年 Google 的 "DRAM Errors in the Wild: A Large-Scale Field Study")。对于当前具有数据密集型负载(8 GB/s 读取)的硬件,这意味着可能每分钟(来自 CERN07 的 10-12 个供应商 BER)或两天一次(10-16 BER)。 Google09 表示每 Mbit 最多可以有 25000-75000 位 FIT(每十亿小时的时间故障),这相当于 8GB RAM 每小时 1-5 位错误(“平均可纠正错误率每年每 GB 2000–6000")。
所以,我想知道,是否可以在系统范围内添加某种软件错误检测(检查用户和内核内存)。例如,为 Linux 内核和/或系统编译器创建一个补丁,为每个内存页面添加一些校验和,并尝试通过定期重新计算校验和来检测静默内存损坏(位翻转)?
例如,我们能否查看所有对内存的写入(来自用户和内核空间),以区分预期的内存更改和内存中的位翻转?或者我们可以通过一些帮助程序以某种方式检测所有代码吗?
我了解任何类型的软件内存 ECC 可能会消耗大量性能并且不会捕获所有错误,但我认为尽早检测至少一些内存位翻转是有用的,然后它们将在以后被重用计算或存储到硬盘驱动器。
我也明白更好的数据保护方法是切换到 ECC 硬件,但大多数 PC 仍然是非 ECC。
【问题讨论】:
一些链接:2005 "SoftECC: A System for Software Memory Integrity Checking" by Dave Dopson, Libsdc 2011 "A Tunable, Software-based DRAM Error Detection and Correction Library for HPC", RedMPI 2012 "Detection and correction of silent data corruption for large-scale high-performance computing" (redmpi.com) 和其他论文来自来自 NCSU 的 David Fiala (fiala.me) 另外,Derek Jones,The Shape of Code 博文:Compiling to reduce the impact of soft errors on program output (2011) 和 Source code will soon need to be radiation hardened (2014) 是的,有很多软件解决方案,看这篇论文:A Survey of Techniques for Modeling and Improving Reliability of Computing Systems 【参考方案1】:问题是,与“软件 ECC 对策”相比,ECC 非常便宜。您可以轻松检测他们是否有 ECC 模块并在没有时抱怨(或打印警告)。
http://www.cyberciti.biz/faq/ecc-memory-modules/
例如,我们能否查看所有对内存的写入(来自用户和内核空间),以区分预期的内存更改和内存中的位翻转?或者我们可以通过一些帮助程序以某种方式检测所有代码吗?
呃,你永远不会“看到”总线上的位翻转。它们实际上是由粒子撞击 RAM 引起的,稍微翻转一下。直到很久以后,您才能注意到您读出的内容与您写入的内容不同。要仅通过总线检测到这一点,您需要一份 all RAM 的副本(即创建一个影子副本)位于您的真实 RAM 中,因此您可以验证每次读取都返回写入该位置的内容。)
尝试通过定期重新计算校验和来检测静默内存损坏(位翻转)?
Redis 专家对用于测试 RAM 是否存在问题的算法写了一篇很好的文章。 http://antirez.com/news/43 但这确实是在寻找 RAM 错误,而不是随机位翻转。
如果“重新计算校验和”仅在您不写入内存时有效。这可能“足够好”,但您需要弄清楚哪些页面没有被写入。
要捕获 100% 的错误,每次写入都必须先计算该内存块的校验和,然后将其与记录的校验和进行比较(以确保该块在 RAM 中没有降级)。只有这样才能安全地进行写入然后更新校验和。正如你可以想象的那样,它的性能将是可怕的(至少慢 100 倍)。
我了解任何类型的软件内存 ECC 可能会消耗大量性能并且不会捕获所有错误,但我认为尽早检测至少一些内存位翻转是有用的,然后它们将在以后被重用计算或存储到硬盘。
嗯,有一种简单的方法可以检测 100% 的错误,但会以 50% 的性能为代价:只需一次在 2 个盒子上运行计算(或者在两个不同时间在一个盒子上运行,可能需要进行 RAM 测试)如果您偏执,则介于两者之间。)如果结果不同,则说明您检测到错误。
另见:
https://www.linuxquestions.org/questions/linux-hardware-18/how-to-detect-ecc-memory-errors-under-linux-886011/
【讨论】:
勇敢,是的,ECC 内存 DIMM 很便宜(芯片成本仅高出 1/8),但使用 ECC 校正/检测的硬件平台并不便宜。例如,英特尔禁用了台式机 CPU 中所有内存控制器(如 Core2、i3/i5/i7)中的 ECC 支持。只有 Xeons 启用了 ECC 电路。不确定AMD。 PS:感谢您提出内存复制的想法(-30-40% 的性能,+100% 的内存开销)。 支持ecc的平台并不便宜,而且往往不是所有平台都支持。如果您想避免使用 Intel x86 / i64 平台,例如使用 Arm soc 找到具有 ecc 内存的机会为零 我不认为 OP 真的在询问校验和,而是像 Hamming Code 这样的纠错代码。通过使用一些额外的位,您可以确定给定单词是否有效。一些代码只能检测单个位错误,其他代码可以检测和纠正多个位错误。但是,在软件中实现这一点会很尴尬,因为在添加奇偶校验位之后,您需要从非标准字长开始以适应大多数计算机的 32/64 位字。 @osgx AMD 在几乎所有东西上都支持 ECC。主要是主板支持的问题。但是,我怀疑,与其在代码中添加一个很有可能降低性能的 hack,不如简单地购买上一代服务器硬件可能是个好主意。六年了,但希望它有所帮助。哈哈 @Pa_ “适用于宇宙射线屏蔽设计的材料是铅和铁等可以阻止初级质子的材料,以及聚乙烯、硼酸化聚乙烯、混凝土和水等材料可以阻止诱导的质子。中子。” —“Cosmic Ray Interactions in Shielding Materials”【参考方案2】:这个问题的答案是肯定的,证据就是在 cmets 中发布的软件SoftECC!
请注意,SoftECC 是内核级解决方案。如果使用用户级应用程序,这将是第三阶段的冗余,这似乎没有必要。
【讨论】:
为什么是“第三”? SoftECC 是第一位的,用户空间 (libsdc) 只有在与 SoftECC 一起使用时才位居第二位。我问的是没有硬件 ECC 的硬件。 您似乎在询问软件错误检测。以上是关于无 ECC 平台的软件内存位翻转检测的主要内容,如果未能解决你的问题,请参考以下文章