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

Memory 无ECC平台的软件内存位翻转检测,memory,linux-kernel,error-detection,Memory,Linux Kernel,Error Detection,大多数可用的桌面(廉价)x86平台现在仍然没有ECC内存支持()。但内存位翻转错误率仍在增长(,:“其内存模块的位错误率为10-12…观察到的错误率比预期低4个数量级”;2009年谷歌)。对于具有数据密集型负载(8 GB/s的读取)的当前硬件,这意味着每分钟(CERN07的10-12 BER)或两天(CERN07的10-16 BER)可能发生一次单位翻转。谷歌09表示,每兆比特(每十亿小时发生一次故障)最多可以有25000-75000个一位适合,这相当于8GB内存每小时1-5位错误(“平均可纠正

大多数可用的桌面(廉价)x86平台现在仍然没有ECC内存支持()。但内存位翻转错误率仍在增长(,:“其内存模块的位错误率为10-12…观察到的错误率比预期低4个数量级”;2009年谷歌)。对于具有数据密集型负载(8 GB/s的读取)的当前硬件,这意味着每分钟(CERN07的10-12 BER)或两天(CERN07的10-16 BER)可能发生一次单位翻转。谷歌09表示,每兆比特(每十亿小时发生一次故障)最多可以有25000-75000个一位适合,这相当于8GB内存每小时1-5位错误(“平均可纠正错误率为每年每GB 2000-6000”)

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

例如,我们是否可以看到所有对内存的写入(来自用户和内核空间),以区分预期的内存更改和内存中的位翻转?或者,我们能不能用一些助手来检测所有代码

我知道任何类型的软件内存ECC都可能会花费大量的性能,并且不会捕获所有的错误,但我认为,在将其重新用于以后的计算或存储到硬盘驱动器之前,尽早检测至少一些内存位翻转是有用的


我也知道,更好的防止内存位翻转的数据保护方法是切换到ECC硬件,但大多数PC仍然是非ECC的。

问题的答案是肯定的,评论中发布的软件就是证明


请注意,SofteC是一个内核级解决方案。如果使用用户登录应用程序,这将是第三阶段的冗余,这似乎是不必要的。

问题是,与“软件ECC对策”相比,ECC非常便宜。您可以轻松检测到他们是否有ECC模块,如果没有,您可以投诉(或打印警告)

例如,我们是否可以看到所有对内存的写入(来自用户和内核空间),以区分预期的内存更改和内存中的位翻转?或者,我们能不能用一些助手来检测所有代码

呃,你永远不会在公共汽车上“看到”这一点。它们实际上是由一个粒子撞击公羊,稍微翻转而引起的。直到很久以后,你才注意到你读的东西与你写的不同。要仅通过总线检测到这一点,您需要所有RAM的副本(即,创建真实RAM中内容的卷影副本,以便验证每次读取都返回写入该位置的内容。)

尝试通过定期重新计算校验和来检测静默内存损坏(位翻转)

Redis的家伙写了一篇很好的关于测试RAM问题的算法的文章。但这实际上是在寻找RAM错误,而不是随机位翻转

If“重新计算校验和”仅在不写入内存时有效。这可能“足够好”,但您需要找出哪些页面没有被写入

为了捕获100%的错误,每次写入都必须通过计算该内存块的校验和,然后将其与记录的校验和进行比较(以确保该块在RAM中没有降级)来进行。只有这样,才可以安全地进行写操作,然后更新校验和。正如您所能想象的,这将是可怕的性能(至少慢100倍)

我知道任何类型的软件内存ECC都可能会花费大量的性能,并且不会捕获所有的错误,但我认为,在将其重新用于以后的计算或存储到硬盘驱动器之前,尽早检测至少一些内存位翻转是有用的

嗯,有一种简单的方法可以检测100%的错误,但要付出50%的性能代价:一次在两个盒子上运行计算(或者在一个盒子上运行两个不同的时间,如果你有妄想症,可能在两个盒子之间进行RAM测试)。如果结果不同,那么你检测到了错误

另见:


一些链接:2005年、Libsdc 2011年、RedMPI 2012()和来自NCSU的David Fiala的其他论文()还有Derek Jones,《代码的形状》博客帖子:,是的,有很多软件解决方案,请参阅本文:为什么是“第三”?SoftECC是第一位的,只有在与SoftECC同时使用时,用户空间(libsdc)才是第二位的。我问的是没有硬件ECC的硬件。似乎你问的是软件错误检测。Brave,是的,ECC内存DIMM很便宜(芯片成本仅高出1/8),但使用ECC校正/检测的硬件平台并不便宜。例如,Intel在桌面CPU的所有内存控制器(如Core2、i3/i5/i7)中禁用ECC支持。只有Xeon启用了ECC电路。对AMD不太清楚。PS:感谢您提出的内存复制的想法(-30-40%的性能,+100%的内存开销)。支持ecc的平台并不便宜,而且通常并非所有平台都受支持。如果您想避免使用Intel x86/i64平台,例如使用Arm soc,那么找到一个具有ecc内存的平台的机会为零。我认为OP并不是真的在询问校验和,而是一个错误纠正代码,例如。通过使用一些额外的位,您可以确定给定的字是否有效。一些代码只能检测单个位错误,其他代码可以检测和纠正多个位错误。不过,在软件中实现这一点会很尴尬,因为在添加奇偶校验位后,您需要从非标准字长开始,以适应大多数计算机的32/64位字。@osgx AMD在几乎所有方面都支持ECC。这主要是主板支持的问题。然而,我怀疑,与其在代码中添加一个很有可能破坏性能的黑客攻击,这可能是一个很好的选择