服务器内存与普通内存比较
我们都知道,在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颗内存颗粒。
而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的内存。
因为有了PLL和 Register芯片的支持,服务器内存可以做的很大,更好的满足日益庞大的软件对内存无止境的要求。
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的信号重驱动需花费一个时钟周期,延迟时间有所增加,因此具有该功能内存的读写性能会稍低于普通内存,相当于以性能换取稳定性。
综合以上两点,就解释了为什么服务器所用的内存一般频率较低,延迟较高。