我又参加了一次设计评审会,听到有人声称特定情景发生的概率“比宇宙射线影响该程序的风险还要低”,这时我意识到自己对这个概率毫无头绪。
“因为2-128是340282366920938463463374607431768211456中的1,即使这些计算错误数十亿倍,我认为我们冒险一试也是有道理的...我相信我们更容易被宇宙射线打乱。”
这位程序员说得对吗?宇宙射线命中计算机并影响程序执行的概率是多少?
我又参加了一次设计评审会,听到有人声称特定情景发生的概率“比宇宙射线影响该程序的风险还要低”,这时我意识到自己对这个概率毫无头绪。
“因为2-128是340282366920938463463374607431768211456中的1,即使这些计算错误数十亿倍,我认为我们冒险一试也是有道理的...我相信我们更容易被宇宙射线打乱。”
这位程序员说得对吗?宇宙射线命中计算机并影响程序执行的概率是多少?
显然,它是相当重要的。根据这篇新科学家文章中引用英特尔专利申请的话:
"宇宙射线诱发的计算机崩溃已经发生,并随着芯片上器件(例如晶体管)缩小而预计会频繁发生。这个问题被预计在未来十年成为计算机可靠性的主要限制因素。"
您可以在此处查看完整的专利内容。
2007年CERN大规模研究“数据完整性”:供应商宣称他们的存储模块的误比特率为10-12,但是实际观察到的错误率比预期低了4个数量级。对于数据密集型任务(每秒8GB的内存读取),这意味着单个位翻转可能每分钟发生一次(10-12供应商BER)或者两天一次(10-16 BER)。
2009年Google论文“野外DRAM错误”指出,每Mb可能会有25000-75000个一位FIT(每十亿小时故障时间),这相当于经过我的计算,每8GB RAM每小时1-5个位错误。该论文也提到了同样的内容:“每GB每年平均可纠正错误率为2000-6000”。
2012年Sandia报告“大规模高性能计算中静默数据损坏的检测和纠正”:虽然“双位翻转被认为不太可能”,但在ORNL密集的Cray XT5上,即使使用ECC,它们的“75,000+ DIMMs每天会出现一个”错误。而单位错误应该更高。
所以,如果程序具有大量数据集(数GB),或具有较高的内存读写速率(GB/s或更高),并且运行时间长达数小时,则我们可以期望桌面硬件会出现数个静默位翻转。这种速率无法通过memtest检测,DRAM模块是好的。
在数千台非ECC PC上进行长时间集群运行,例如BOINC全球范围内的网格计算,将始终存在来自内存位翻转以及磁盘和网络静默错误的错误。
对于更大的机器(数万台服务器),即使拥有单比特错误的ECC保护,正如我们在Sandia 2012年的报告中看到的那样,每天可能会有双位翻转,因此您将没有机会运行数天的完整并行程序(除非定期进行检查点并从最近的良好检查点重新启动以防止双重错误)。巨型机器的缓存和CPU寄存器(包括架构和内部芯片触发器,例如ALU数据通路)也会出现位翻转,因为其中并非所有部分都受到ECC保护。
提示:如果DRAM模块出现问题,情况会更加糟糕。例如,我曾经在笔记本电脑中安装了新的DRAM,几周后电脑就死机了。它开始出现大量的内存错误。我的电脑会卡住、Linux重新启动、运行fsck,在根文件系统上发现错误,并表示希望在纠正错误后重新启动。但是在每次下一次重启(我做了约5-6次)时,仍然会在根文件系统上发现错误。
看来宇宙射线导致丰田汽车电子设备故障的概率非常高 :)
通过采用ECC技术,可以纠正宇宙射线引起的1位误差。为了避免宇宙射线导致的2位误差的10%情况,ECC单元通常交错分布在芯片上,以便没有两个单元相邻。宇宙射线事件影响两个单元将产生两个可纠正的1位错误。
Sun公司表示:(Part No. 816-5053-10 April 2002)
一般来说,在DRAM存储器中,宇宙射线软错误发生率约为每MB的 FIT(1 FIT = 10亿小时内出现1次设备故障)范围在10到100之间。因此,具有10 GB内存的系统应该每1,000至10,000小时出现一次ECC事件,而具有100 GB的系统则会每100至1,000小时出现一次事件。但这只是一个粗略的估计值,会受到上述影响因素的影响而变化。
这是一个真正的问题,这就是为什么服务器和嵌入式系统使用ECC内存,以及为什么飞行系统与地面系统不同。
例如,注意到专为“嵌入式”应用程序设计的英特尔产品往往会在规格说明中添加ECC。而针对平板电脑的Bay Trail则没有它,因为这会使内存变得更加昂贵,可能还会更慢。如果平板电脑偶尔崩溃一次程序,用户并不太关心。相比较,软件本身要比硬件不可靠得多。但是对于用于工业机械和汽车的SKU,ECC是强制性的。因为在这里,我们期望软件更加可靠,并且来自随机干扰的错误将是一个真正的问题。
符合IEC 61508和类似标准的系统通常具有引导测试,检查所有RAM是否功能正常(无位卡在零或一),以及运行时的错误处理,尝试从ECC检测到的错误中恢复,并经常进行内存清洗任务,连续读写内存以确保注意到任何错误。
但对于主流PC软件来说,这不是个大问题。对于长寿命的服务器?使用ECC和故障处理器。如果一个无法纠正的错误导致内核崩溃,那就这样吧。或者你可以变得有点偏执,在使用锁步执行的冗余系统中,如果一个核心被损坏,另一个核心可以接管,同时第一个核心重新启动。
后来,“宇宙辐射”成为我们工作场所的一个内部笑话。每当我们的服务器出现问题,而我们找不到任何解释时,我们会开玩笑地将故障归因于“宇宙辐射”。:-)
finally
块时,我们将不得不用“总是会执行除非程序退出,或者被宇宙射线击中”来说明? - skaffman