全部博文(120)
分类:
2009-11-16 17:25:41
通过上面的分析我们知道Parity内存是通过在原来数据位的基础上增加一个数据位来检查当前8位数据的正确性,但随着数据位的增加Parity用来检验的数据位也成倍增加,就是说当数据位为16位时它需要增加2位用于检查,当数据位为32位时则需增加4位,依此类推。特别是当数据量非常大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就显得力不从心了,正是基于这样一种情况,一种新的内存技术应运而生了,这就是ECC(错误检查和纠正),这种技术也是在原来的数据位上外加校验位来实现的。不同的是两者增加的方法不一样,这也就导致了两者的主要功能不太一样。它与Parity不同的是如果数据位是8位,则需要增加5位来进行ECC错误检查和纠正,数据位每增加一倍,ECC只增加一位检验位,也就是说当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。总之,在内存中ECC能够容许错误,并可以将错误更正,使系统得以持续正常的操作,不致因错误而中断,且ECC具有自动更正的能力,可以将Parity无法检查出来的错误位查出并将错误修正。
什么是ECC?
ECC是 Error Checking and Correcting(错误检查和纠正)的简写。 它广泛应用于各种领域的计算机指令中。 而本文主要讲解ECC在计算机内存中的应用。ECC和奇偶校验(Parity)类似。然而,在那些Parity只能检测到错误的地方,ECC实际上可以纠正绝大多数错误。经过内存的纠错,计算机的操作指令才可以继续执行。
在内存中会发生什么样的错误呢?
绝大多数常见的内存出错都是:单位错,多位错,列错,行错。它们都比较相似。单位错大多发生在读一个完整的比特或词的时候有一位比特出错。当读相同的比特和词时总是同一位数据出错,则称为多位错。单位错发生在很多词中,就称列错或行错。
这些错误是怎样被纠正的?
ECC内存使用额外的比特(bit)存储一个用数据加密的代码。当数据被写入内存,相应的ECC代码与此同时也被保存下来。当重新读回刚才存储的数据时,保存下来的ECC代码就会和读数据时产生的ECC代码做比较。如果两个代码不相同,他们则会被解码,以确定数据中的那一位是不正确的。然 后这一错误位会被抛弃,内存控制器则会释放出正确的数据。 被纠正的数据很少会被放回内存。假如相同的错误数据再次被读出,则纠正过程再次被执行。重写数据会增加处理过程的开销,这样则会导致系统性能的明显降低。如果是随机事件而非内存的缺点产生的错误,则这一内存地址的错误数据会被再次写入的其他数据所取代。
ECC到底需要多少额外的空间呢?
加密ECC代码以及纠正一位错误,只需要很少的额外存储空间。和Parity不同的是ECC不会以数据位数的增加速度而增加。例如:数据的位数增加一倍,Parity也得增加一倍,而ECC只需增加一位。所以,一个系统中用8位数据,则需1位用于Parity检验,5位用于ECC。然而,一个32位数据需要4位作Parity,7位作ECC。当数据带宽增加到64位则同时各需要8位分别作Parity和ECC。下表列出了不同带宽的数据所需要的不同位数的ECC和Parity。
Word Bits |
ECC Bits |
Parity Bits |
5 |
1 | |
16 |
6 |
2 |
32 |
7 |
4 |
128 |
9 |
16 |
就如您们所看见的一样,当数据为64位时所用的ECC和Parity位数相同。这就是为什么内存制造商用一对或几对36位内存模块造就ECC。例如:EDO+ECC就是36位内存模块。成对上就是72位,存储64位数据,多余的8位作ECC用。而SDRAM+ECC是72位内存模块。因而它是成单上,多余的8位作ECC用。可能有的系统会应用到额外的ECC内存模块,但是工业标准的36位SIMM条在成本和实用性上更加吸引设计者和最终用户。
ECC是怎样被应用于现实世界中的?
含有ECC的系统可能对于ECC有着不同的用法。通常,当错误数据需要被纠正时,系统会记录下错误并把错误报告给系统管理者。如果数据被多次读出而没有被其他数据取代,则许多出错会被报 告于相同的内存单元。如果系统关闭后这一相同的内存单元被纠正,一个故障很可能发生在内存中而且必须被替代。
目前一些厂商推出的入门级低端服务器使用的多是普通PC用的SD RAM,不带ECC功能,在选购时应该注意这个指标。
普通内存、ECC内存和REG ECC内存有什么不同?
前言
我们都知道,在INTEL平台,北桥负责与CPU的联系,并控制内存、AGP、PCI数据在北桥内部传输。基本上只要主板芯片组确定,那么其支持的内存类型也就确定了。
INTEL芯片组划分的很清楚,865PE属于工作站级别芯片组,不支持ECC内存,只能使用普通内存,875P芯片组属于低端服务器/工作站级别,支持ECC内存和普通非ECC内存,而E7525属于高端服务器,为了保证其稳定性,必须采用ECC REG内存,使用其他内存无法点亮。
在AMD方面,K8 CPU集成了内存控制器,CPU与内存直接交换数据,不通过北桥。939针的ALTHON 64系列不支持ECC,所以只能用普通内存,939针的OPTERON支持ECC内存和普通非ECC内存,940针的OPTERON系列只能使用ECC REG内存,插入普通内存无法点亮。
普通内存 ECC内存 REG ECC内存有什么不同?
普通内存大家经常接触,DDR400的内存现在遍地都是,很多高档内存甚至可以运行DDR600/DDR2 800,而有些内存也可以达到2-2-2-5这样低的延迟,因为大家接触的比较多,这里就暂不作介绍了。 反观ECC和REG ECC内存不追求高频率和低延迟,INTLE平台内存运行频率一般在DDR333或者是DDR2 400,,AMD平台内存运行频率在DDR400,延时也多在4-4-4-8左右,从性能上看丝毫不占优势,但是稳定才是其立足的根本。
图为DDR2 ECC内存。这里我们常说的ECC内存就是单指的 Unbuffer ECC,其价格和普通内存相比只贵10%-20%,从外观来说,Unbuffer ECC内存因为要满足效验纠错的需要,加入了一颗ECC效验颗粒,由于采用的是TOSP封装,使得内存看上去每面有9颗内存颗粒。
图为DDR2 ECC内存
而REG ECC的价格就贵了许多,内存上面的芯片一般比普通主板多出2-3个,主要是PLL (Phase Locked Loop)和Register IC,它们的具体用处如下PLL(Phase Locked Loop) 琐相环集成电路芯片,内存条底部较小IC,比Register IC小,一般只有一个,起到调整时钟信号,保证内存条之间的信号同步的作用。
Register IC内存条底部较小的集成电路芯片(2-3片),起提高驱动能力的作用。服务器产品需要支持大容量的内存,单靠主板无法驱动如此大容量的内存,而使用带Register的内存条,通过Register IC提高驱动能力,使服务器可支持高达32GB的内存。
图为DDR2 400 ECC REG 1 SPD芯片 2 PLL芯片 3 Register IC芯片 4 内存颗粒
因为有了PLL和 Register芯片的支持,服务器内存可以做的很大,更好的满足日益庞大的软件对内存无止境的要求。
图为日本上市的单条4GB REG ECC内存
ECC 原理以及Registers功能
服务器一般要求24小时×365天不间断运行,而且不允许中途故障频出或者频繁重启,对可靠性和稳定性两项指标要求极为苛刻。相比较而言,PC机对可靠性和稳定性的要求就相对简单了许多——系统崩溃重启即可,每天开机时间多数不超过10小时。截然不同的应用决定了二者对内存功能要求的差异性。
为什么拥有ECC技术的服务器可以做到7X24或者365X24不死机重起呢,我们要先从最原始的奇偶校验说起。
在计算机内,所有的信息都是以简单的“0”与“1”表示;不过当数据在电子元件间进行传递时,是有可能发生数据“误传”的情形,也就是说原来该是0的比特数据,却被误植为1的比特数据,而产生错误。其可能发生的原因相当多,包括电子噪声、元件硬件上的问题,或是传输接口不稳等,都可能数据错误,随之而来的时服务器重起,数据丢失,WINDOWS崩溃等一系列严重的后果,正如混沌学中的蝴蝶效益,极小的起因引发巨大的后果。也正因为如此,在存储器中便发展出ECC(Error-Correcting Code)与Parity Check等的检错方式,希望能降低数据传输的错误,使服务器能够长时间稳定工作。
比特(bit)是内存中的最小单位,也称“位”、它只有两个状态分别以1和0表示。我们将8个连续的比特叫做一个字节(byte)。非奇偶校验内存的每个字节只有8位,若它的某一位存储了错误的值,就会使其中存储的相应数据发生改变而导致应用程序发生错误。而奇偶校验内存在每一字节(8位)外又额外增加了一位作为错误检测之用。
比如一个字节中存储了某一数值(1、0、0、1、1、1、1、0),把这每一位相加起来(1+0+0+1+1+1+1+0=5)。若其结果是奇数,校验位就定义为1,反之则为0。当CPU返回读取储存的数据时,它会再次相加前8位中存储的数据,计算结果是否与校验位相一致。当CPU发现二者不同时就作出一定的反应。但Parity有个缺点,当内存查到某个数据位有错误时,却并不一定能确定在哪一个位,也就不一定能修正错误,只能让数据源重新发送一次信号,再次校验。所以带有奇偶校验的内存的主要功能仅仅是“发现错误”,并能纠正部分简单的错误。
通过上面的分析我们知道Parity内存是通过在原来数据位的基础上增加一个数据位来检查当前8位数据的正确性,但随着数据位的增加Parity用来检验的数据位也成倍增加,就是说当数据位为16位时它需要增加2位用于检查,当数据位为32位时则需增加4位,依此类推。特别是当数据量非常大时,数据出错的几率也就越大,对于只能纠正简单错误的奇偶检验的方法就显得力不从心了,正是基于这样一种情况,一种新的内存技术应允而生了,这就是ECC(错误检查和纠正).
ECC(Error Checking and Correcting)内存,它也是在原来的数据位上外加位来实现的。不同的是两者增加的方法不一样,这也就导致了两者的主要功能不太一样。它与Parity不同的是如果数据位是8位,则需要增加5位来进行ECC错误检查和纠正,数据位每增加一倍,ECC只增加一位检验位,也就是说当数据位为16位时ECC位为6位,32位时ECC位为7位,数据位为64位时ECC位为8位,依此类推,数据位每增加一倍,ECC位只增加一位。
总之,在内存中ECC能够容许错误,并可以将错误更正,使系统得以持续正常的操作,不致因错误而中断,且ECC具有自动更正的能力,可以将Parity无法检查出来的错误位查出并将错误修正。当然在纠错时系统的性能有着明显降低,不过这种纠错对服务器等应用而言是十分重要的。
Registers通常与ECC概念被一并提起,不少人认为二者都是纯粹的错误校验,甚至将这两个概念混淆起来。其实,Registers的概念与ECC大不相同,它指的是信号的重新驱动(re-driving)过程。
在很多时候,内存中保留的数据经过多次刷新之后仍然可能出现代表二进制数据的电平信号发生偏差的情况。Registers所起到的其实是一个事前预防的作用。拥有Registers功能的内存模组,可以通过重新驱动控制信号来改善内存的运作,提高电平信号的准确性,从而有助于保持系统长时间稳定运作。不过,由于Registers的信号重驱动需花费一个时钟周期,延迟时间有所增加,因此具有该功能内存的读写性能会稍低于普通内存,相当于以性能换取稳定性。
综合以上两点,就解释了为什么服务器所用的内存一般频率较低,延迟较高。
主板芯片组对应的内存列表
市售内存推荐