服务器ECC内存的工作原理

鱼云 2024-12-12 22:02:25

在开始今天的分享之前,我先给大家展示两条1R*8的内存条。

现在的CPU都是64位的,每次和内存通信都要传输64位的数据。 1R*8类型内存中的1R表示该内存模块只有1个rank,而8则表示每个内存颗粒在每次64位内存IO过程中提供8位数据。这样算下来,64位数据需要8个内存颗粒组合在一起。

这两种内存条中,为什么一个有 8 个芯片,另一个有 9 个芯片?这个故事也是从点滴翻转开始的。

1. 位翻转和 ECC 内存

当我们的计算机运行时,CPU总是需要与内存进行交互。然而,在交互过程中,由于周围电磁场的干扰,有可能发生比特翻转。

图片

据统计,一根8GB的内存条平均每小时会出现1到5个这样的错误。

图片

当我们使用个人电脑进行工作时,内存主要用于处理图片、视频等数据。即使内存中发生位翻转,也可能只影响一个像素值,很难感觉出来,影响不大。即使关键系统代码中确实出现了位翻转并导致运行问题,也没什么大不了的,可以通过重启来解决。

但在服务器应用中,通常处理的是非常重要的计算,可能是订单交易,也可能是存款。另外,服务器往往要连续运行数月甚至数年,而且没有办法通过重启来解决问题。因此,服务器对位翻转错误的容忍度较低。需要一种能够在一定程度上解决比特翻转问题的影响的技术方案。

ECC就是这样一种内存技术。它的英文全称是“Error and”,对应的中文名称叫“Error and ”。从名字就可以看出,ECC不仅可以发现内存中的错误,还可以纠正错误。

与不采用ECC技术的个人电脑内存相比,所有内存颗粒都可以用来存储数据。 ECC存储器中的每64位数据需要额外的8位数据作为校验位以帮助检测或纠正错误。

图片

这样,我们就得到了开头问题的答案。普通记忆棒中的所有粒子都是用来存储真实数据的。除了数据之外,ECC存储器还需要存储8位奇偶校验位。

普通1R*8内存中,64/8=8个颗粒就足够了。但ECC内存中的1个IO需要传输72位数据,因此总共需要72 / 8 = 9个内存颗粒。

问题已经解决了。但我们“练内功”公众号的风格不仅是知,更是懂道理。那么我们来看看ECC纠错算法是如何工作的。

2. ECC纠错原理

那么为什么ECC内存可以通过额外的8位冗余校验数据来检测并纠正错误呢?我们先来看最简单的奇偶校验。

2.1 简单奇偶校验

可以使用简单的奇偶校验来检测单个位翻转。请注意,关键关键字是“发现”和“单比特”。该算法只能用于发现,不能用于纠错。并且仅对单位翻转有效,无法处理两位同时翻转的情况。

原理是在要监控的数据前面添加1位数据,保证整个二进制数组(包括校验位)中1的个数为偶数。

例如,下面是一个8位二进制数组。

图片

对于情况1:假设原始数据中已经有偶数个1,因此将校验位设置为0,使得1的总数为偶数个。

对于情况2:假设原始数据中1的个数为奇数,则需要将校验位设置为1,以保证整个数组中1的个数为偶数。由于校验位不是真实的用户数据,因此不影响数据的正确读取。

一般来说,在添加了1位校验位的二进制数组中,在正确的条件下,1的个数始终是偶数。

如果翻转1位,必然会导致二进制数组中1的个数变成奇数。这样,我们可以通过观察数据中1的个数是否为偶数来判断是否发生了单比特翻转。

了解了原理之后,你也会知道前面提到的简单奇偶校验的两个局限性。

2.2 汉明码简介

为了解决纠错和两次数据错误的问题,1950年在简单奇偶校验算法的基础上提出了汉明校验码算法。我还因为这个算法获得了 1968 年的图灵奖。尽管已经过去了70多年,但它仍然广泛应用于服务器的ECC内存中。

首先要说的是汉明码有局限性。对于以下情况:

实际上,内存中 64 位数据中的 3 位或更多位同时出现的概率非常非常低。另外,内存的运行速度需要足够快。当汉明码在硬件中实现时,性能损失大约只有2% - 3%。因此,尽管汉明码无法应对超过3位的位翻转,但它仍然广泛应用于服务器端内存的错误检查和纠正。由于应用场景不同,SSD硬盘采用了支持多位翻转校验和纠错的LDPC码。

由于基于汉明码的ECC存储器无法处理3位或更多位的翻转,因此安全对策领域的一个特殊方向是研究如何在存储器中故意创建3位翻转以实现攻击行为。以及如何对抗 3 位翻转攻击。

2.3 汉明码算法设计

汉明校验码算法设计的核心思想是设置更多的校验位,然后利用交叉验证来定位错误位。

汉明码包含64位用户数据和8位冗余校验码,所以总共有72位数据。这个72位数据可以看作是一个9行8列的二维矩阵。

第一级校验是矩阵左上角的位校验位,用于实现整个矩阵的奇偶校验。

第二级验证是列分组验证。在列上,使用3种方法将8列分为不同的二分组。每组都设计有一个奇偶校验位,实现整个组的奇偶校验。

第一种列分组方法是将第2、4、6、8列视为一组,并在该组中安排一位作为校验码

图片

第二种列分组方法是将第3、4、7、8列视为一组,在该组中安排一位作为校验码

图片

第三列分组方法是将第5、6、7、8列视为一组,在该组中安排一位作为校验码

图片

这样,这三种分组方法交织在一起,并且每种方法都包含另一种分组的部分列。

图片

第三层是行分组验证。由于行比列多一组,因此使用 4 组进行简单奇偶校验。

第一种行分组方法是将第2、4、6、8行视为一组,并在该组中安排一个位作为校验码

图片

第二种行分组方法是将第2、3、7、8行视为一组,在该组中安排一位作为校验码

图片

第三行分组方法是将第5、6、7、8行视为一组,在该组中安排一位作为校验码

图片

第三行分组方法是将剩余的第9行单独视为一组,并在该组中安排一位作为校验码。

图片

鱼云提供全球范围的云服务器和物理服务器租赁服务,具备强大的DDoS防御功能,确保您业务安全稳定运行,同时提供灵活定制和专业支持以满足多样化需求。
0 阅读:0