指令纠错技术ECC( Error Checking and Correcting) 是为了解决同位检查码技术的缺陷而产生的一种新的
计算机内存纠错技术。
技术构成
要了解ECC技术,就不能不提到Parity(
奇偶校验)。在ECC技术出现之前,内存中应用最多的是另外一种技术,就是Parity(奇偶校验)。我们知道,在数字电路中,最小的数据单位就是叫“比特(bit)”,也叫数据“位”,“比特”也是内存中的最小单位,它是通过“1”和“0”来表示数据高、低
电平信号的。在数字电路中8个连续的比特是一个
字节(byte),在内存中不带“奇偶校验”的内存中的每个字节只有8位,若它的某一位存储出了错误,就会使其中存储的相应数据发生改变而导致应用程序发生错误。而带有“奇偶校验”的内存在每一字节(8位)外又额外增加了一位用来进行错误检测。比如一个字节中存储了某一数值(1、0、1、0、1、0、1、1),把这每一位相加起来(1+0+1+0+1+0+1+1=5)。若其结果是奇数,对于偶校验,校验位就定义为1,反之则为0;对于
奇校验,则相反。当CPU返回读取存储的数据时,它会再次相加前8位中存储的数据,计算结果是否与校验位相一致。当CPU发现二者不同时就作出试图纠正这些错误,但Parity有个缺点,当内存查到某个数据位有错误时,却并不一定能确定在哪一个位,也就不一定能修正错误,所以带有奇偶校验的内存的主要功能仅仅是“发现错误”,能纠正部分简单的错误。
工作原理
ECC(Error Correct Code,
纠错码)是在原来的数据位上外加位来实现的,增加的位用来重建错误数据。在ECC纠错体系中,如果数据为n个
字节,则外加的ECC位为log2n + 5。例如对于64位数据,需要外加log28 + 5 = 8个ECC位。
当出现一个存储位错误时,ECC体系可以自动进行纠错。当出现2个
数据位错误时,可以检测出来,但不能纠错,这种行为通常称作“单错纠正/双错检测(Single Error Correction/Double Error Detection ,简称SEC/DED)。一次存取中有2个以上的数据位出错时,由于SEC/DED体系检测不出来了,致使数据的完整性受损。采用这种结构的
存储器,当检测出多位错误时,系统就会报告出现了致命故障(Fatal fault),之后系统崩溃。
技术特点
ECC内存的最大特点并不是因为它速度快(速度方面根本与ECC无关,只与内存类型有关),而是因为它具有特殊的纠错能力,可以使
服务器保持长时间的稳定运行。
Chipkill技术
我们知道
ECC内存可以同时检测和纠正单一比特的错误,但如果同时检测出两个以上的比特错误,则一般无能为力。Chipkill技术正是IBM公司为了解决ECC技术的不足之处而开发的,是一种新的ECC内存保护标准。
IBM的Chipkill 技术是利用内存的子结构方法来解决这一问题的。内存子系统的设计原理是这样的,单一芯片,无论数据宽度是多少,只对于一个给定的ECC识别码,它的影响最多为一比特。举个例子来说明,如果使用4比特宽的DRAM,4比特中的每一位的奇偶性将分别组成不同的ECC识别码,这个ECC识别码是用单独一个
数据位来保存的,也就是说保存在不同的内存空间地址。因此,即使整个
内存芯片出现故障,每个ECC识别码也将最多只出现一比特的坏数据,而这种情况完全可以通过 ECC逻辑修复,从而保证内存子系统的
容错性,使
服务器在出现故障时,拥有更强大的自我恢复能力,使服务器的可靠性和稳定性得到更加充分的保障。
实际意义
内存是一种电子器件,在其工作过程中难免会出现错误,而对于稳定性要求高的用户来说,内存错误可能会引起致命性的问题。内存错误根据其原因还可分为
硬错误和软错误。硬件错误是由于硬件的损害或缺陷造成的,因此数据总是不正确,此类错误是无法纠正的;软错误是随机出现的,例如在内存附近突然出现电子干扰等因素都可能造成内存软错误的发生。
为了能检测和纠正内存软错误,首先出现的是内存“奇偶校验”。内存中最小的单位是比特,也称为“位”,位有只有两种状态分别以1和0来标示,每8个连续的比特叫做一个字节(byte)。不带奇偶校验的内存每个字节只有8位,如果其某一位存储了错误的值,就会导致其存储的相应数据发生变化,进而导致应用程序发生错误。而奇偶校验就是在每一字节(8位)之外又增加了一位作为错误检测位。在某字节中存储数据之后,在其8个位上存储的数据是固定的,因为位只能有两种状态1或0,假设存储的数据用位标示为1、1、1、0、0、1、0、1,那么把每个位相加(1+1+1+0+0+1+0+1=5),结果是奇数。对于偶校验,校验位就定义为1,反之则为0;对于奇校验,则相反。当CPU读取存储的数据时,它会再次把前8位中存储的数据相加,计算结果是否与校验位相一致。从而一定程度上能检测出内存错误,奇偶校验只能检测出错误而无法对其进行修正,同时虽然双位同时发生错误的概率相当低,但奇偶校验却无法检测出双位错误。
ECC(Error Checking and Correcting,错误检查和纠正)内存,它同样也是在
数据位上额外的位存储一个用数据加密的代码。当数据被写入内存,相应的ECC代码与此同时也被保存下来。当重新读回刚才存储的数据时,保存下来的ECC代码就会和读数据时产生的ECC代码做比较。如果两个代码不相同,他们则会被解码,以确定数据中的那一位是不正确的。然后这一错误位会被抛弃,
内存控制器则会释放出正确的数据。被纠正的数据很少会被放回内存。假如相同的错误数据再次被读出,则纠正过程再次被执行。重写数据会增加处理过程的开销,这样则会导致系统性能的明显降低。如果是随机事件而非内存的缺点产生的错误,则这一内存地址的错误数据会被再次写入的其他数据所取代。
使用
ECC校验的内存,会对系统的性能造成不小的影响,不过这种纠错对服务器等应用而言是十分重要的,并且由于带ECC校验的内存价格比普通内存要昂贵许多,因此带有ECC校验功能的内存绝大多数都是
服务器内存。
认识误区
一谈到
服务器内存,大家都一致强调要买
ECC内存,认为ECC内存速度快,其实是一种错误地认识,ECC内存成功之处并不是因为它速度快(速度方面根本不关它事只与内存类型有关),而是因为它有特殊的纠错能力,使
服务器保持稳定。ECC本身并不是一种内存型号,也不是一种内存专用技术,它是一种广泛应用于各种领域的
计算机指令中,是一种指令纠错技术。
ECC比奇偶校正技术更先进的方面主要在于它不仅能发现错误,而且能纠正这些错误,这些错误纠正之后计算机才能正确执行下面的任务,确保服务器的正常运行。ECC内存即纠错内存,简单的说,其具有发现错误,纠正错误的功能,一般多应用在高档台式电脑/服务器及
图形工作站上,这将使整个
电脑系统在工作时更趋于安全稳定。
之所以说它并不是一种内存型号,那是因为并不是一种影响内存结构和存储速度的技术,它可以应用到不同的内存类型之中,就象在前讲到的“奇偶校正”内存,它也不是一种内存,最开始应用这种技术的是
EDO内存,SD也有应用,而ECC内存主要是从SD内存开始得到广泛应用,而新的DDR、RDRAM也有相应的应用,主流的ECC内存其实是一种SD内存。