无ECC平台的软件内存位翻转检测

35

现在大多数可用的桌面(廉价)x86平台仍然不支持ECC内存(错误检测和纠正)。但是内存位翻转错误的率仍在增长(不是最好的SO线程CERN 2007年规模较大的研究“数据完整性”:“对于它们的内存模块,比特错误率为10-12 ... 观察到的错误率比预期低了4个数量级”; 2009 Google 的“野外DRAM错误:大规模现场研究”)。对于当前具有数据密集型负载(8GB / s 读取速度)的硬件而言,这意味着每分钟可能会发生一次单比特翻转(来自CERN07的供应商BER为10-12),或者每两天发生一次(来自CERN07的BER为10-16)。Google09表示,每Mb​​it可能会有25000-75000个一位FIT(每十亿小时故障时间),这相当于8GB RAM每小时1-5个比特错误(“每年每GB的平均可纠正错误率为2000-6000”)。

因此,我想知道是否可以以系统范围的方式添加某种软件错误检测(检查用户和内核内存)。例如,创建Linux内核的补丁和/或系统编译器,以添加每个内存页面的校验和,并尝试通过定期重新计算校验和来检测静默内存损坏(位翻转)。

例如,我们能否看到对内存的所有写入(来自用户和内核空间),以区分预期内存更改和内存位翻转?还是我们可以用一些辅助程序对所有代码进行仪表化处理?

我理解任何类型的软件内存ECC都可能会牺牲大量性能并且不能捕获所有错误,但我认为它可以用于及早检测一些内存位翻转,以免在后续计算或存储到硬盘中重新使用。

我也知道更好的保护数据免受内存位翻转的方法是切换到ECC硬件,但大多数个人电脑仍然不支持ECC。


1
一些链接:2005年Dave Dopson的“SoftECC:用于软件内存完整性检查的系统”(http://pdos.csail.mit.edu/papers/softecc:ddopson-meng/softecc_ddopson-meng.pdf),2011年的Libsdc“面向HPC的可调节的基于软件的DRAM错误检测和纠正库”(http://www.fiala.me/pubs/papers/libsdc11.pdf),2012年的RedMPI“用于大规模高性能计算的静默数据损坏检测和纠正”(http://www.fiala.me/pubs/papers/sc12-redmpi.pdf)(http://redmpi.com/)以及来自NCSU的David Fiala的其他论文(http://www.fiala.me/)。 - osgx
1
此外,Derek Jones的《The Shape of Code》博客文章:编译以减少软错误对程序输出的影响(2011)源代码很快需要抗辐射保护(2014) - osgx
是的,有许多软件解决方案,可以参考这篇论文:计算系统可靠性建模和改进技术综述 - user984260
2个回答

4
事实是,与“软件ECC对策”相比,ECC非常便宜。您可以轻松检测它们是否具有ECC模块,并在它们没有时发出警告(或打印警告)。

http://www.cyberciti.biz/faq/ecc-memory-modules/

例如,我们能否查看所有对内存的写入(来自用户空间和内核空间),以区分预期的内存更改与内存位翻转?或者我们能否通过某些辅助工具对所有代码进行仪器化?
嗯,您永远不会在总线上“看到”位翻转。它们实际上是由粒子撞击 RAM 引起的,从而翻转了一个位。只有很久之后,您才会注意到您读出的内容与您写入的内容不同。要仅通过总线检测此类问题,您需要一个 RAM 的副本(即创建实际 RAM 中内容的影子副本,以便您可以验证每次读取返回的都是该位置写入的内容)。
尝试通过定期重新计算校验和来检测静默内存损坏(位翻转)?
Redis 的开发者在其博客中详细介绍了一种测试 RAM 问题的算法。http://antirez.com/news/43 但这实际上是在寻找 RAM 错误,而不是随机位翻转。
如果“重新计算校验和”仅在您没有向内存写入时起作用。那可能已经足够了,但您需要弄清楚哪些页面未被写入。
为了捕捉到100%的错误,每次写入之前必须先计算该内存块的校验和,然后将其与记录的校验和进行比较(以确保该块在RAM中没有退化)。只有在这样做完全安全之后,才能进行写入并更新校验和。可以想象,这样的性能将非常差(至少慢100倍)。
我知道任何类型的软件内存ECC都可能会耗费大量性能,并且无法捕捉所有错误,但我认为它可以用于及早检测一些内存位翻转错误,以免它们被重复使用在后续计算或存储到硬盘中。
好吧,有一种简单的方法可以检测到100%的错误,以50%的性能代价:同时在两个盒子上运行计算(或在两个不同时间在一个盒子上运行计算,也许在其中一个时段进行RAM测试,如果你很谨慎的话)。如果结果不同,则已检测到错误。
另请参见:

https://www.linuxquestions.org/questions/linux-hardware-18/how-to-detect-ecc-memory-errors-under-linux-886011/


8
勇敢的是,ECC内存DIMMS便宜(仅比芯片成本贵1/8),但将使用ECC校正/检测的硬件平台并不便宜。例如,英特尔在桌面CPU(如Core2,i3 / i5 / i7)中禁用所有内存控制器的ECC支持。只有Xeon启用了ECC电路。不确定AMD是否支持ECC。PS:感谢您提出的内存复制思路(-30-40%性能,+100%内存开销)。 - osgx
4
支持ECC的平台并不便宜,而且通常并不支持所有平台。如果您想避免使用Intel x86 / i64平台,例如使用Arm SoC,则几乎找不到支持ECC内存的选项。 - humanityANDpeace
3
我认为OP并不是在询问校验和,而是像海明码这样的纠错码。通过使用一些额外的位,您可以确定给定的单词是否有效。有些代码只能检测单个位错误,而其他代码可以检测和纠正多个位错误。但在软件中实现这一点会很麻烦,因为您需要从非标准字长开始,以适应添加奇偶校验位后大多数计算机的32/64位字长。 - sandyscott
2
@osgx AMD支持在几乎所有产品上使用ECC。这主要取决于主板的支持情况。然而,我怀疑,与其在您的代码中添加一个有很大可能会降低性能的hack,不如购买上一代的服务器硬件会更好。六年过去了,但希望这可以帮到您。哈哈 - Tripp Kinetics
反过来问:在非ECC系统中,有没有减少位翻转可能性的对策?例如,保持系统冷却、防止电离辐射等。 - Pa_
1
@Pa_ “适合宇宙射线屏蔽设计的材料包括铅和铁等能够阻止主要质子的材料,以及聚乙烯、硼化聚乙烯、混凝土和水等能够阻止感应中子的材料。” —⁠“屏蔽材料中的宇宙射线相互作用 - Christian - Reinstate Monica C

1
这个问题的答案是肯定的,评论中发布的SoftECC软件就是证明!请注意,SoftECC是一种内核级解决方案。如果使用用户空间应用程序,它将成为冗余的第三阶段,似乎不是必要的。

为什么是“第三个”?SoftECC 是第一个,用户空间(libsdc)只有在与 SoftECC 同时使用时才是第二个。我正在询问没有硬件 ECC 的硬件。 - osgx
似乎您在询问有关软件错误检测的问题。 - vitorafsr

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接