内存纠错:奇偶性校验、ECC、Chipkill
内存纠错技术的发展过程
90年代初,内存体系采用奇偶性校验(Parity Verifying)技术。奇偶校验内存在每一字节(8位)外又额外增加了一位作为错误检测之用,BIOS中的监控程序会将存入内存中的数据位相加,并将结果存于校验位中。比如一个字节中存储了某一数值10011110,每一位加起来的结果为奇数(1+0+0+1+1+1+1+0=5),校验位存入1。当CPU读取储存的数据时,监控程序再次相加存储的8位数据,并将计算结果与校验位相比较。如果发现二者不同,系统就会产生出错信息。奇偶校验技术仅能粗略地检查内存错误,并不具备纠错能力。
另一种内存纠错技术叫做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),之后系统崩溃。
随着RAM芯片的集成度的提高和内存容量的增大,内存发生错误的概率也随之增加。几年前被认为很可靠的SEC/DED内存体系,今天已经力不从心了,寻求具有多位纠错能力的内存体系结构一直是众多厂商追求的目标。
1996年,Compaq公司的Advanced ECC技术实现了纠正单一内存芯片上的多位错误,也可以纠正内存条上单芯片的失效。1998年,惠普在LH3服务器产品中提出的自修复概念,主要内容也是内存的多位纠错能力。
Chipkill内存是IBM为NASA(美国太空总署)计划于2003年向火星发射的 “火星漫游者”探测器而设计的,2001年,IBM将这种Chipkill技术移植到“蓝色基因”服务器产品中,成为其面向电子商务的电子蜥蜴计划中的一个重要行动。接着DELL等厂商也纷纷在服务器中采用了这种内存体系。
Chipkill是一种具有自愈(Self-healing)能力的内存体系结构,在工作过程中进行自我测试(self-test)和自我诊断(self-diagnosis),如果某个RAM芯片或内存条损坏,可以向管理员报告出错信息,但机器仍可继续运行,管理人员可在适当的时候更换故障的零件。
Chipkill内存的结构
RAM器件失效最为严重的情形是其全部数据位全部发生错误,纠正这种错误的基本思路应该着眼于芯片和系统的硬件结构,而不可能通过软件升级的方式来达到目的。
存储器中的每个字节外加一个ECC位构成ECC字。如果存储器系统的数据宽度为32个字节(或256位),实际的存储器数据的宽度是256+32=288位。同时,每一个数据位都被置于分离的ECC字中。
存储系统由4个DIMM模块构成,32个字节(256位)的数据被分成4个ECC字,每个ECC字含有8个字节(64位)的数据位和8个ECC位。这样,一个ECC字的实际长度为64+8=72位,存储数据总长度为72×4=288位。
存储器控制器(Memory Controller)把每个ECC字被分成4个长度为18位的段,分别存储于4个DIMM中。同时,每个DIMM中也存储了4个来自不同的ECC字的段。然后,每个段的18个位再被存储在不同的RAM芯片中。
经过上述处理,每个DRAM芯片中只保存了ECC字的一位。如果RAM芯片失效,导致某个芯片中的全部18个位都出错,也只是造成ECC字的一位错误。因为每个ECC字具有SEC/DED能力,可以自动纠错,所以可以恢复所有的数据。当然,对于RAM中的某一位、某一行、某一列发生失效,系统也可以实现自动纠正错误。
Chipkill内存的应用前景
通过对ECC体系进行改造而设计的自动纠错的内存体系结构,实现了人们盼望已久的彻底避免系统瘫痪和数据丢失的目的。短短几年内,集成了Chipkill技术的电脑产品已经在交通调度、证券交易等高可靠性系统中得到了广泛应用了。
人们发现,使用Chipkill内存的电脑产品,在提高了可靠性的同时,也降低了系统维护成本,减少了电子商务中的风险和法律责任,种种好处足以抵消价格偏高的不利因素。
http://www.plge.com.cn/archives/715