普通不用 ECC 内存的电脑出现位翻转的概率有多大?

72 天前
 Jinnrry

我记得很久很久以前,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 数据结构有兼容处理

3896 次点击
所在节点    硬件
45 条回复
ebushicao
72 天前
我觉得这就和钓鱼不戴头盔出现被人用砖头砸头的情况的概率一样。
noahhhh
72 天前
内存越大概率越高,128GB 无 ECC 基本每个月要重启一遍,自己台式机除更新从不重启,从没遇到问题
leonshaw
72 天前
跑 memtest86
xtreme1
72 天前
你加个玩内存 oc 的群, 里面一堆人天天处心积虑绞尽脑汁地想怎么才能不翻转.
tool2dx
72 天前
@xtreme1 哈哈,这倒是真的。给内存超频,往极限超,分分钟翻转。
ETiV
72 天前
我们 AWS 生产环境遇到过一次(疑似),而且是灾难级别的

程序端打印的日志跟 slow query 里的语句差了一个 bit ,这个翻转了的 bit 把 where 给注释掉了,然后这条 update 语句更新了全表…
moudy
72 天前
@yjsdaniel #20 这种就是挂了之后找不到问题,推给内存了吧
ouqihang
72 天前
我觉得现在消费级电脑,内存出错的概率还是挺大的。游戏闪退,后来排查到内存太热😥,内存大概 55 度到 60 度开始不稳定,但闪退后系统还是好的。系统里也有出错不过系统纠正过。所以服务器 ecc 内存频率低,还要严格按照厂家的参数跑不能超频。
以前用一个挺古老的软件做计算化学,到自己用的那轮,一组人算出来的结果不相同,大概内容是找分子的最低能量结构。实验员说应该结果都一样,但这批电脑上几天加过内存,戴尔商用机。当然了复杂的任务是扔服务器跑,家用电脑连续开几天也怕死机,本地运行只是用来验证是不是能跑。
但学期末有人赶进度,服务器不够就开几台台式机跑。
JensenQian
72 天前
普通电脑基本上每天重启下就好了
1145148964
72 天前
一个关键滴的问题是你在淘宝买到滴 ECC 内存都是老板亲自动手装的。标签也是老板贴滴。
kinkin666
72 天前
@ETiV 如此炫酷,好像有点体会到服务器 ecc 内存的重要性了
m1nm13
72 天前
@totoro625 真的不是 MEMTEST 都不过的内存吗....
privil
72 天前
@ETiV #26 所以 AWS 的服务器没用 ECC 内存。话说我似乎看过你们的文章。
GrayXu
72 天前
个人机器无所谓。
scale 到大型数据中心这个场景来讨论,内存错误就是常见的错误。
直接上数据,阿里云上二十五万台服务器在八个月时间里,有三万多台机器出现 CE 内存错误(七千万多次)。UE 导致的 failure 有三千多的工单。
ETiV
72 天前
@privil @kinkin666 我并没有表述 AWS 的服务器没有用 ECC 内存

可能是我们的机器实在是太多了,所以遇到了非常极端的小概率问题的可能性也是有的吧…

因为在这个事儿之前,我刚读过 Dropbox 关于它客户端 bitflip 相关问题的文章,因为 Dropbox 的用户体量就非常巨大,他们的客户端上的 bitflip 很常见…(文章里是这么说的)

----
当然我们遇到的这个问题并没有定论,而且 AWS 的服务器不可能不用 ECC 内存,毕竟那么大的体量,出了问题他们担待不起。

我对于问题原因的判断单纯因为两端的日志比对,字符 3 ( 0x33 ) 变成了字符 #( 0x23 ),就一个 bit 之差…
cest
72 天前
@ETiV #35
ecc 也不是一定能抓到,抓到了修复也不是一定能修复

不能出错的得上多套系统比对
Kiriya
72 天前
家用计算机不超频使用基本不用考虑
kinkin666
71 天前
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.

那看来普通系统还是偶尔重启或者把实例轮流渐入渐出清爽点
yanqiyu
71 天前
我唯一一次意识到 bitrot 有可观的概率是同学告诉我他们在散列上取数的电脑爱死机(电脑暴露在中子束流下面)
yanqiyu
71 天前
草错别字*,是散裂不是散列

以及原文代码,我不清楚 golang 里面的 bool 类型具体内存布局是怎样的,有可能你只用了一个字甚至更长的内存区域里面的一个 bit ,那就效率更低了

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1056179

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX