一、比特翻转和 ECC 内存
当我们的计算机运行时,CPU总是需要与内存交换数据。然而,在交互过程中,由于周围电磁场的干扰,有可能发生比特翻转。
图片
据统计,一根8GB的记忆棒每小时平均会出现1-5个这样的错误。
图片
当我们使用个人电脑进行工作时,内存主要用于处理图片、视频等数据。即使内存中发生位翻转,也可能只影响一个像素值,很难感觉出来,影响不大。即使关键系统代码中确实出现了位翻转并导致运行问题,也没什么大不了的,可以通过重启来解决。
但在服务器应用中,通常处理的是非常重要的计算,可能是订单交易,也可能是存款。另外,服务器往往要连续运行数月甚至数年,而且没有办法通过重启来解决问题。因此,服务器对位翻转错误的容忍度较低。需要一种能够在一定程度上解决比特翻转问题的影响的技术方案。
ECC就是这样一种内存技术。它的英文全称是“Error Checking and Correcting”,对应的中文名称叫做“Error Checking and Correcting”。从名字就可以看出,ECC不仅可以发现内存中的错误,还可以纠正错误。
与不采用ECC技术的个人电脑内存相比,所有内存颗粒都可以用来存储数据。 ECC存储器中的每64位数据需要额外的8位数据作为校验位以帮助检测或纠正错误。
图片
这样,我们就得到了开头问题的答案。普通记忆棒中的所有粒子都是用来存储真实数据的。除了数据之外,ECC存储器还需要存储8位校验位。
普通1R*8内存中,64/8=8个颗粒就足够了。但ECC内存中的一次IO需要传输72位数据,因此总共需要72/8=9个内存颗粒。
二、ECC 纠错原理
那么为什么ECC内存可以通过额外的8位冗余校验数据来检测和纠正错误呢?我们先来看最简单的奇偶校验。
2.1 简单的奇偶校验
可以使用简单的奇偶校验来检测单位翻转。请注意,关键关键字是“发现”和“单比特”。该算法只能用于发现,不能用于纠错。并且仅对单位翻转有效,无法处理两位同时翻转的情况。
原理是在要监控的数据前面添加1位数据,保证整个二进制数组(包括校验位)中1的个数为偶数。
例如,下面是一个8位二进制数组。
图片
对于情况1:假设原始数据中已经有偶数个1,则将校验位设置为0,使得1的总数为偶数个。
对于情况2:假设原始数据中1的个数为奇数,则需要将校验位设置为1,以保证整个数组中1的个数为偶数。由于校验位不是真实的用户数据,因此不影响数据的正确读取。
一般来说,在添加了一位校验位的二进制数组中,在正确的情况下,1的个数总是偶数。
了解了原理之后,你也会知道前面提到的简单奇偶校验的两个局限性。
首先,我们只能发现出了问题,但不知道错误发生在哪里,因此无法纠正。其次,它只能检测单位翻转,而不能对两位翻转执行任何操作。
2.2 海明码介绍
为了解决纠错和两次数据错误的问题,Richard Hamming 在简单奇偶校验算法的基础上于1950 年提出了汉明校验码算法。理查德·汉明(Richard Hamming) 本人也因该算法于1968 年获得了图灵奖。尽管已经过去了70多年,但它仍然广泛应用于服务器的ECC内存中。
首先要说的是汉明码有局限性。对于以下情况:
如果64位数据中发生单比特翻转,汉明码不仅可以检测到错误,还可以找到错误位置并进行纠正。汉明码仅在发生两位翻转时才能检测到错误。但无法定位具体位置,也无法纠正错误。只能通过重传的方式解决。如果发生3 次或更多位翻转,则汉明码就没用了。实际上,内存中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行单独视为一组,并在该组中也安排一位作为校验码
图片
2.4 海明码单比特翻转纠错
接下来我们看一下海明算法是如何实现单位翻转的发现和纠错的。我们假设这些数据中发生了一位翻转。更具体地说,例如,用户数据位No.30是错误的。
此时,检查第一层的所有比特就可以检测到比特错误的发生。但目前尚不清楚事情发生在哪里。
然后使用二级列分组验证。
图片
当分别验证三个列组时,发现第一个列组方法发现错误,第二个列组方法验证通过,第三个列组方法发现错误。根据各组之间的包含关系,可以推断错误发生在第6列。
然后进行第三级行分组验证。
图片
第一行群组验证通过,第二行群组验证通过,第三行群组验证失败,第四行群组验证通过。然后根据行组的交集关系,可以推断出错误数据发生在第5行。
结合上述列分组的验证结果,可以推断第5行第6列的数据是错误的。由于二进制数据只有两个值:0和1,因此如果发现错误可以纠正。这就是汉明码进行单比特错误检查和纠错的实现原理。
2.4 海明码两比特错误发现
汉明码可以实现对单位错误的纠错,但对于同时出现的两位错误,只能检测出错误,无法定位错误位置,因此无法纠错实现了。
我们假设错误发生在用户数据的第29位和第30位。那么既然两个错误同时发生,那么整个矩阵中的验证一定找不到,验证通过。
图片
我们再看一下列验证结果。
图片
第一组发现错误,第二组验证正确,第三组验证正确(简单的奇偶校验无法检测到两位错误),则列组交叉验证得出错误的结论发生在第2列。显然,两位翻转的错误导致列分组检查结论错误。
我们来看看验证结果。
图片
行分组验证结果全部正确。两位翻转也会导致行奇偶校验失败。
那么1)全矩阵验证的结论是没有错误,2)列分组验证的结论是第2列出现错误,3)行分组验证的结论是没有错误。
三个验证结论不一致,说明出现了错误,但不止一个。
汉明码发现有错误,但无法知道错误的具体位置。如果出现这种情况,那么这次内存IO返回的数据就无效了,重新读取一下就可以了。
需要指出的是,当3 位或更多位错误时,汉明码可能会被误判为正确。但由于64 位中同时出现3 位错误的概率太低,汉明码仍然广泛应用于服务器ECC 内存中。
总结
一开始我们看到了两个内存条,一个有8个黑色颗粒,另一个有9个内存颗粒。这是因为ECC内存除了每次向CPU提供64位用户数据外,还需要额外提供8位数据作为冗余校验位。这些冗余校验位的功能是检测并纠正单位错误。对于两位错误,可以检测到错误,但无法纠正错误。
由于需要额外的8位冗余奇偶校验位,ECC内存的颗粒数量比普通内存要多。对于1R*8内存,ECC内存需要9个颗粒。对于1R*4内存,由于1个内存颗粒的位宽为4,因此还需要2个颗粒。
大家好,服务器ECC内存工作原理相信很多的网友都不是很明白,包括也是一样,不过没有关系,接下来就来为大家分享关于服务器ECC内存工作原理和的一些知识点,大家可以关注收藏,免得下次来找不到哦,下面我们开始吧!
本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/6396.html
用户评论
想了解更多关于ECC内存如何工作的知识,来学习一下!
有18位网友表示赞同!
服务器性能和数据安全都离不开内存,ECC内存真是个好东西。
有15位网友表示赞同!
一直听说ECC内存重要,不过具体是怎么运作的没太清楚,这篇文章正好可以解答我的疑惑。
有15位网友表示赞同!
做服务器相关工作的人应该了解一下ECC内存吧?
有5位网友表示赞同!
学习技术的路上,总有新的知识需要加深理解!
有16位网友表示赞同!
一篇关于服务器核心组件的文章,肯定很有价值!
有5位网友表示赞同!
今天刚好学习数据安全方面的内容,这篇文章来得正是时候。
有18位网友表示赞同!
51CTO文章质量一直不错,相信这篇ECC内存工作原理的文章也值得一读。
有5位网友表示赞同!
了解了服务器ECC内存的工作原理,才能更好地配置和维护服务器系统。
有19位网友表示赞同!
ECC内存对保障数据安全起着关键的作用。
有18位网友表示赞同!
原来ECC内存的运作原理是这样子的!
有16位网友表示赞同!
服务器知识越来越丰富啦!
有17位网友表示赞同!
学习过程中积累一些专业技能,在未来会有所帮助。
有20位网友表示赞同!
掌握了相关的技术知识,才能更好地解决实际问题。
有15位网友表示赞同!
51CTO的文章总是很深入浅出,很好理解!
有7位网友表示赞同!
对服务器的了解就从ECC内存开始吧!
有18位网友表示赞同!
想要成为专业IT工程师,就要不断学习这些基础知识。
有20位网友表示赞同!
ECC内存这个概念之前不太了解,现在终于明白它是如何工作的。
有8位网友表示赞同!
技术的世界总是充满着新鲜事物,需要不断探索和学习。
有17位网友表示赞同!