我记得很久很久以前,V 站有一次讨论要不要上 ECC 的帖子,当时有大佬给出了一段代码,大致是声明一个很大很大的数组,然后全部赋值成 1 ,然后再反复遍历检查,有可能出现值为 0 的结果。但是我现在无论如何都搜不到那篇帖子了。有没有大佬再给写个复现代码?
我拿 Go 写的
package main
import "fmt"
func main() {
var arg [10000000000]bool
for {
for i := 0; i < 10000000000; i++ {
arg[i] = true
}
for i := 0; i < 10000000000; i++ {
if !arg[i] {
fmt.Println("位翻转了!")
return
}
}
fmt.Println("!!")
}
}
我在 mac 上运行了很久,都没发生翻转,不知道是概率太低还是 golang 的 bool 数据结构有兼容处理
1
xupefei 134 天前 via iPhone
你得把电脑搬到核反应堆里面才能看到这个现象。
|
2
xuelu520 134 天前
概率比你中 500W 概率还要低
|
3
R18 134 天前
Jim N. Gray and Catharine van Ingen: "Empirical Measurements of Disk Failure
Rates and Error Rates," Microsoft Research, MSR-TR-2005-166, December 2005 |
4
R18 134 天前
现代计算机上,你完全可以忽略。除非你用了不合格的内存,或者处于辐射过大。
|
5
DonaldErvinKnuth 134 天前
正好做这个。出现的概率很低。不同的产品级别,要求不一样,比如汽车上的,企业级的,消费类的,消费类又有普通消费和游戏等。要求高的出厂会测试的更严格,用的原料更好,要求低的出厂要求会低,或者会有要求高过滤掉的再来测试,合格后出厂,类似于 i9 i7 i5 一样,同样的芯片,好的用 i9 ,不好的锁核下放。
但是出现这种比特翻转的概率很低,即使是普通消费类,出厂测试都是在高温几十或者上百度,低温零下几十度,反复测试几个小时甚至几十个小时,然后才会在一批货中出现几个。 |
6
totoro625 134 天前 3
来源:/t/975376 https://www.bilibili.com/video/BV1AW4y1y796 个人体验认为,品牌全新内存比不知来源的二手任何牌子的 ECC 内存可靠 如果是淘宝买的便宜 ECC ,宁可不上 ECC 真实经历就是淘宝买的十铨内存,Windows 经常蓝屏,换了京东买的英睿达的就好了 |
7
Reficul 134 天前
正常的时候大概率不会反转,但是反转了之后可能导致灾难性问题的话还是得上 ECC 。而且在内存快不行的时候,错误率可能会上升。
如果数据不持久化,大不了就是花屏或者程序莫名其妙挂掉,重启之后数据 reset 了就好了。但是对于 ZFS 这类依赖内存的文件系统,可能会把数据搞炸。 |
8
processzzp 134 天前 2
可以看看这篇 NASA 的 PPT ,AMD CPU 总共吃了 17 兆 rad 的辐射,都没有出现损坏; DDR3 内存的耐辐射能力稍微低一点,但也吃了 1.1k rad 的辐射。现代工艺制程的芯片,耐辐射能力比老芯片强了好多倍
https://nepp.nasa.gov/workshops/etw2013/talks/Wed_June12_2013/1140_LaBel_ AMD Processor Radiation Test Results.pdf |
9
v2tudnew 134 天前
非关键数据损坏问题也不大,但不知道系统是否对关键程序、数据做校验。
|
11
yinmin 134 天前 via iPhone
op 应该想了解 Rowhammer 攻击吧,你的代码是不会发生翻转的,要反复对某个特定内存单元快速读/写,导致隔壁单元的内存翻转。
|
12
cheng6563 134 天前
dell 普通台式电脑,挂了 MySQL 当开发机使用了约 2 年,然后之后基本每个月文件系统都要炸一次,你看着办。
|
13
liu731 134 天前
机房在福岛吗?真没必要担心这个问题,其他原因造成的宕机可能性更高。
|
14
kaedeair 134 天前
概率比较低,需要大量频繁数据写入的场景下才比较容易观察到
|
15
GeruzoniAnsasu 134 天前
看这个
https://zhuanlan.zhihu.com/p/37235131 https://www.infocomm-journal.com/cjnis/article/2018/2096-109x/2096-109x-4-1-00069.shtml 针对性构造的 bit 翻转攻击是可能要结合电路结构来设计 payload 的 |
16
SkywalkerJi 134 天前
试试液氮超频有可能会出现。
|
17
shadowyue 134 天前
测久点,普通环境下,花的电费能让供电局专门来关照的时候,是不是就能测出来了?
|
19
liaohongxing 134 天前
直接上 DDR5 ,由于 DDR5 频率。容易出出,默认都自带 odecc , 比没带 ecc 的强一丢丢
|
20
yjsdaniel 134 天前 1
你不会是接了俄罗斯的绕月卫星改进项目外包订单了吧。。。。他们宣称的就是出现了此问题。
|
21
ebushicao 134 天前
我觉得这就和钓鱼不戴头盔出现被人用砖头砸头的情况的概率一样。
|
22
noahhhh 134 天前 via Android
内存越大概率越高,128GB 无 ECC 基本每个月要重启一遍,自己台式机除更新从不重启,从没遇到问题
|
23
leonshaw 134 天前
跑 memtest86
|
24
xtreme1 134 天前 1
你加个玩内存 oc 的群, 里面一堆人天天处心积虑绞尽脑汁地想怎么才能不翻转.
|
26
ETiV 134 天前 via iPhone 5
我们 AWS 生产环境遇到过一次(疑似),而且是灾难级别的
程序端打印的日志跟 slow query 里的语句差了一个 bit ,这个翻转了的 bit 把 where 给注释掉了,然后这条 update 语句更新了全表… |
28
ouqihang 134 天前 via Android
我觉得现在消费级电脑,内存出错的概率还是挺大的。游戏闪退,后来排查到内存太热😥,内存大概 55 度到 60 度开始不稳定,但闪退后系统还是好的。系统里也有出错不过系统纠正过。所以服务器 ecc 内存频率低,还要严格按照厂家的参数跑不能超频。
以前用一个挺古老的软件做计算化学,到自己用的那轮,一组人算出来的结果不相同,大概内容是找分子的最低能量结构。实验员说应该结果都一样,但这批电脑上几天加过内存,戴尔商用机。当然了复杂的任务是扔服务器跑,家用电脑连续开几天也怕死机,本地运行只是用来验证是不是能跑。 但学期末有人赶进度,服务器不够就开几台台式机跑。 |
29
JensenQian 134 天前 via Android
普通电脑基本上每天重启下就好了
|
30
1145148964 134 天前
一个关键滴的问题是你在淘宝买到滴 ECC 内存都是老板亲自动手装的。标签也是老板贴滴。
|
34
GrayXu 134 天前
个人机器无所谓。
scale 到大型数据中心这个场景来讨论,内存错误就是常见的错误。 直接上数据,阿里云上二十五万台服务器在八个月时间里,有三万多台机器出现 CE 内存错误(七千万多次)。UE 导致的 failure 有三千多的工单。 |
35
ETiV 134 天前
@privil @kinkin666 我并没有表述 AWS 的服务器没有用 ECC 内存
可能是我们的机器实在是太多了,所以遇到了非常极端的小概率问题的可能性也是有的吧… 因为在这个事儿之前,我刚读过 Dropbox 关于它客户端 bitflip 相关问题的文章,因为 Dropbox 的用户体量就非常巨大,他们的客户端上的 bitflip 很常见…(文章里是这么说的) ---- 当然我们遇到的这个问题并没有定论,而且 AWS 的服务器不可能不用 ECC 内存,毕竟那么大的体量,出了问题他们担待不起。 我对于问题原因的判断单纯因为两端的日志比对,字符 3 ( 0x33 ) 变成了字符 #( 0x23 ),就一个 bit 之差… |
37
Kiriya 133 天前
家用计算机不超频使用基本不用考虑
|
38
kinkin666 133 天前
wiki ECC_memory
The most-common error correcting code, a single-error correction and double-error detection (SECDED) Hamming code, allows a single-bit error to be corrected and (in the usual configuration, with an extra parity bit) double-bit errors to be detected. 那看来普通系统还是偶尔重启或者把实例轮流渐入渐出清爽点 |
39
yanqiyu 133 天前
我唯一一次意识到 bitrot 有可观的概率是同学告诉我他们在散列上取数的电脑爱死机(电脑暴露在中子束流下面)
|
40
yanqiyu 133 天前
草错别字*,是散裂不是散列
以及原文代码,我不清楚 golang 里面的 bool 类型具体内存布局是怎样的,有可能你只用了一个字甚至更长的内存区域里面的一个 bit ,那就效率更低了 |
41
kenvix 133 天前
哪有你这样测试的?你这种代码能测出来就有鬼了,至少也得全设置成 0xFF ,sleep ,再等上一个月再取出查看
|
42
yanqiyu 133 天前
^最好还要 mlock 一段内存下来,设置成各种各样的 pattern ,要么 sleep 之后检查,要么频繁写入频繁检查
|
45
lx0758 129 天前
我的小主机, 买的 2400 的内存, 经常蓝屏. BIOS 改成 2133 , 连续运行一年都没问题
|