Mar*_*son 529 statistics physics probability error-detection risk-analysis
我再一次进行了设计评审,并且遇到了一个声称特定情景的概率"低于宇宙射线的风险"影响该程序的说法,并且我发现我没有最微弱的想法是什么概率是.
"因为2 -128是340282366920938463463374607431768211456中的1个,我认为我们在这里抓住机会是合理的,即使这些计算已经减少了几十亿......我们对宇宙射线的风险更大我相信,把我们搞砸了."
这个程序员是否正确?宇宙射线撞击计算机并影响程序执行的概率是多少?
ken*_*ytm 301
来自维基百科:
IBM在20世纪90年代的研究表明,计算机通常每月每256兆字节RAM会出现一次宇宙射线引起的误差.[15]
这意味着每月每字节3.7×10 -9的概率,或每秒每秒1.4×10 -15.如果你的程序运行1分钟并占用20 MB的RAM,那么失败概率就是
60 × 20 × 1024²
1 - (1 - 1.4e-15) = 1.8e-6 a.k.a. "5 nines"
Run Code Online (Sandbox Code Playgroud)
错误检查有助于减少故障的后果.此外,由于Joe评论的芯片尺寸更紧凑,故障率可能与20年前不同.
ire*_*ses 87
显然,并非无足轻重.来自这篇新科学家的文章,来自英特尔专利申请的引用:
"由于设备(例如,晶体管)的芯片尺寸减小,宇宙射线诱发的计算机崩溃已经发生并且预计随着频率的增加而增加.这个问题预计将成为未来十年计算机可靠性的主要限制因素."
osg*_*sgx 51
注意:这个答案不是关于物理,而是关于非ECC内存模块的静默内存错误.一些错误可能来自外太空,一些错误来自桌面的内部空间.
在CERN集群和Google数据中心等大型服务器场上,有几项关于ECC内存故障的研究.具有ECC的服务器级硬件可以检测并纠正所有单个位错误,并检测许多多位错误.
我们可以假设有很多非ECC桌面(和非ECC移动智能手机).如果我们检查文件的ECC纠正错误率(单位翻转),我们就可以知道非ECC内存上的静默内存损坏率.
大规模CERN 2007研究"数据完整性":供应商宣称" 其内存模块的误码率为10 -12 "," 观察到的错误率比预期低4个数量级 ".对于数据密集型任务(8 GB/s的内存读取),这意味着可以每分钟(10 -12供应商BER)或两天一次(10 -16 BER)发生单比特翻转.
2009谷歌的论文"疯狂的DRAM错误:一场大规模的现场研究"表示每Mbit可以有高达25000-75000的一位FIT(每十亿小时的失败时间),相当于1到5位计算后,每小时8GB内存的错误.Paper说同样的话:" 每年每GB标准的可纠正错误率为2000-6000 ".
2012 Sandia报告"检测和纠正大规模高性能计算的无声数据损坏":"双位翻转被认为不太可能",但在ORNL的密集Cray XT5中,它们"以每天75,000+ DIMM的速率",甚至与ECC.并且单比特错误应该更高.
因此,如果程序有大量的数据集(几个GB),或拥有高记忆读取或写入速率(GB/s以上),并且它运行了几个小时,那么我们可以预计高达数无声位翻转的桌面硬件.memtest无法检测到这个速率,DRAM模块也很好.
长集群在数千台非ECC PC上运行,如BOINC互联网范围的网格计算将始终存在来自内存位翻转以及磁盘和网络静默错误的错误.
而对于更大的机器(10和数千台服务器),甚至从单比特错误ECC保护,如我们在桑迪亚国家实验室的2012报告中可以看到,可以有双位翻转每一天,这样你就没有机会跑并行全尺寸程序连续几天(如果出现双重错误,无需定期检查点并从最后一个好的检查点重新启动).巨大的机器也将在其缓存和cpu寄存器中获得位翻转(架构和内部芯片的触发器,例如在ALU数据路径中),因为并非所有这些都受ECC保护.
PS:如果DRAM模块坏了,情况会更糟.例如,我在笔记本电脑上安装了新的DRAM,几周后就死了.它开始产生很多内存错误.我得到的:笔记本电脑挂起,Linux重新启动,运行fsck,发现根文件系统上的错误,并表示它想在纠正错误后重新启动.但是在每次下次重启时(我做了大约5-6次),根文件系统上仍然存在错误.
Jes*_*erE 30
维基百科援引IBM在90年代进行的一项研究表明,"计算机通常每月每256兆字节RAM会出现一次宇宙射线引起的错误." 不幸的是,引用的是科学美国人的一篇文章,该文章没有给出任何进一步的参考.就个人而言,我发现这个数字非常高,但也许宇宙射线引起的大多数记忆错误都不会引起任何实际或明显的问题.
另一方面,当谈到软件场景时,人们谈论概率通常不知道他们在谈论什么.
Kev*_*ell 29
好吧,宇宙射线显然导致丰田汽车中的电子设备发生故障,所以我想说概率非常高:)
eck*_*kes 23
使用ECC,您可以纠正宇宙射线的1位错误.为了避免宇宙射线导致2位错误的10%的情况,ECC单元通常在芯片上交错,因此没有两个单元彼此相邻.因此,影响两个单元的宇宙射线事件将导致两个可校正的1位误差.
太阳州:( 2002年4月第816-5053-10号)
一般而言,宇宙射线软错误在DRAM存储器中以~10到100 FIT/MB的速率发生(1 FIT = 1个器件在10亿小时内失效).因此,具有10 GB内存的系统应每1,000至10,000小时显示一次ECC事件,而100 GB的系统每100至1,000小时显示一次事件.然而,这是一个粗略的估计,将随着上述效果的变化而变化.
jan*_*anm 17
内存错误是真实的,ECC内存确实有帮助.正确实现ECC内存将纠正单比特错误和检测双位错误(如果检测到这样的错误停止系统.)您可以从人们经常抱怨似乎是通过运行解决的软件问题,看到这个Memtest86是和发现不好的记忆.当然,由宇宙射线引起的瞬态故障与始终存在故障的记忆不同,但它与更广泛的问题相关,即您应该相信您的记忆能够正常运行多少.
基于20 MB常驻大小的分析可能适用于普通应用程序,但大型系统通常具有多个具有大主存储器的服务器.
有趣的链接:http: //cr.yp.to/hardware/ecc.html
不幸的是,页面中的Corsair链接似乎已经死了.
Rob*_*vey 13
如果某个程序对生命至关重要(如果某个程序失败就会杀死它),它需要以一种故障安全方式编写,或者从这种故障中自动恢复.所有其他程序,YMMV.
丰田汽车就是一个很好的例子.说出你对油门电缆的看法,但它不是软件.
另见http://en.wikipedia.org/wiki/Therac-25
jak*_*om2 13
这是一个真正的问题,这就是ECC内存用于服务器和嵌入式系统的原因.为什么飞行系统不同于地面飞行系统.
例如,请注意,用于"嵌入式"应用程序的英特尔部件往往会在规格表中添加ECC.平板电脑的Bay Trail缺乏它,因为它会使内存更昂贵并且可能更慢.如果平板电脑每次在蓝色月亮中崩溃一个程序,用户就不会太在意了.无论如何,软件本身远不如硬件可靠.但对于打算用于工业机械和汽车的SKU,ECC是强制性的.从这里开始,我们期望SW更可靠,随机扰动的错误将是一个真正的问题.
经过IEC 61508和类似标准认证的系统通常都有启动测试,可以检查所有RAM是否正常工作(没有位卡在零或一个位置),以及运行时尝试从ECC检测到的错误中恢复的错误处理,以及通常还有内存擦除器任务经过并连续读写内存,以确保发生的任何错误都会被注意到.
但对于主流PC软件?没有大碍.对于长寿命的服务器?使用ECC和错误处理程序.如果无法纠正的错误导致内核崩溃,那就这样吧.或者你变得偏执并使用具有锁定步骤执行的冗余系统,这样如果一个核心被破坏,另一个核心可以在第一个核心重新启动时接管.
eri*_*len 11
我曾经编程这在太空中飞行,然后你的设备(据说,没有人曾经给我任何一篇关于它,但它被说成是在业务常识)可以预期的宇宙射线诱发错误所有的时间.
在这里的许多答案中,"宇宙射线事件"被认为具有均匀分布,这可能并非总是如此(即超新星).虽然根据定义(至少根据维基百科)的"宇宙射线"来自外太空,但我认为同样包括当地的太阳风暴(也就是在同一把伞下的日冕物质抛射)是公平的.我相信它可能导致几个位在短时间跨度,甚至可能破坏启用ECC的内存.
众所周知,太阳风暴会对电力系统造成相当大的破坏(如1989年3月的魁北克停电).计算机系统很可能也会受到影响.
大约10年前,我坐在另一个人的旁边,我们坐在我们的每台笔记本电脑上,这是一个充满"暴风雨"太阳天气的时期(坐在北极,我们可以间接地观察到这一点 - 很多北极光到可见).突然 - 在同一时刻 - 我们的笔记本电脑都崩溃了.他正在运行OS X,我正在运行Linux.我们都不习惯笔记本电脑崩溃 - 这在Linux和OS X上是一件非常罕见的事情.由于我们在不同的操作系统上运行,所以可以或多或少地排除常见的软件错误(并且它在飞跃过程中没有发生过第二).我把这个事件归结为"宇宙辐射".
后来,"宇宙辐射"已成为我职场的一个内部笑话.每当我们的服务器出现问题而我们找不到任何解释时,我们开玩笑地将故障归结为"宇宙辐射".:-)
我已经经历了这一点-宇宙射线翻转一点并不罕见,但是人们很少会观察到这一点。
2004年,我正在为安装程序开发一种压缩工具。我的测试数据是一些Adobe文件的解压缩量约为500 MB或更多。
经过乏味的压缩运行和解压缩运行以测试完整性之后,FC / B显示一个字节的差异。
MSB已在该字节内翻转。我也翻了个身,担心我有一个疯狂的错误,该错误只会在非常特定的条件下才会出现-我什至不知道从哪里开始寻找。
但是有件事告诉我要再次运行测试。我运行它并通过了。我设置了一个脚本来在一夜之间运行测试5次。早上,所有五个人都过去了。
所以那绝对是宇宙射线的翻转。
作为一个数据点,这恰好发生在我们的构建中:
02:13:00,465 WARN - In file included from /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/ostream:133:
02:13:00,465 WARN - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale:3180:65: error: use of undeclared identifier '_'
02:13:00,465 WARN - for (unsigned __i = 1; __i < __trailing_sign->size(); ++_^i, ++__b)
02:13:00,465 WARN - ^
02:13:00,465 WARN - /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/locale:3180:67: error: use of undeclared identifier 'i'
02:13:00,465 WARN - for (unsigned __i = 1; __i < __trailing_sign->size(); ++_^i, ++__b)
02:13:00,465 WARN - ^
Run Code Online (Sandbox Code Playgroud)
这看起来非常像编译过程中发生的一点翻转,偶然发生在源文件中非常重要的位置。
我不一定说这是“宇宙射线”,但症状相符。