数据库管理218期 2024-07-11
- 数据库管理-第218期 服务器内存(20240711)
- 1 内存
- 2 ECC内存
- 3 原理
- 3.1 多副本传输
- 3.2 纠错码
- 3.3 汉明码
- 总结
数据库管理-第218期 服务器内存(20240711)
作者:胖头鱼的鱼缸(尹海文)
Oracle ACE Pro: Database(Oracle与MySQL)
PostgreSQL ACE Partner
10年数据库行业经验,现主要从事数据库服务工作
拥有OCM 11g/12c/19c、MySQL 8.0 OCP、Exadata、CDP等认证
墨天轮MVP、年度墨力之星,ITPUB认证专家、专家百人团成员,OCM讲师,PolarDB开源社区技术顾问,HaloDB外聘技术顾问,OceanBase观察团成员,青学会MOP技术社区(青年数据库学习互助会)技术顾问
圈内拥有“总监”、“保安”、“国产数据库最大敌人”等称号,非著名社恐(社交恐怖分子)
公众号:胖头鱼的鱼缸;CSDN:胖头鱼的鱼缸(尹海文);墨天轮:胖头鱼的鱼缸;ITPUB:yhw1809。
除授权转载并标明出处外,均为“非法”抄袭
之前对CPU、SSD和网络等服务器涉及的硬件进行过讲解,除开主板承载了前面说的这些组件以外,还有一个非常重要的组件,那就是内存,相较于一般桌面级(一般家用PC)内存,服务器内存一把自带纠错功能,我们也称之为ECC(Error Checking and Correcting)内存。
本期就简单针对ECC内存如何工作的进行简单讲解。
1 内存
内存(Memory)是计算机的重要部件,它用于暂时存放CPU中的运算数据,以及与硬盘等外部存储器交换的数据。它是外存与CPU进行沟通的桥梁,计算机中所有程序的运行都在内存中进行。只要计算机开始运行,操作系统就会把需要运算的数据从内存调到CPU中进行运算,当运算完成,CPU将结果传送出来。
内存的出现主要是为了弥补外部存储与CPU内建缓存(即L1、L2、L3)之间巨大的带宽与延迟差异,本质上也是一个相较于CPU内建缓存更大但是一般远小于外部存储的中间数据转存设备,提前将数据从速度较慢的外部存储提前加速准备,减少甚至消除CPU获取数据等待时间。
我们现在在服务器上主要使用的内存是DDR内存,具体什么是DDR这里就不做深入讲解了,主流的内存代数为DDR4和DDR5。除了一般内存以外,还有基于内存接口(或PCIe接口)的非易失性内存PMEM(以Intel傲腾为例),在内存和外部存储之间提供了一块更大且速度接近于内存的数据缓存区域。
2 ECC内存
一般来说,服务器是承载重要的业务系统的,在电子设备运行过程中是存在大量电磁干扰的,这些电磁干扰是可能造成内存与CPU数据交互过程中发生比特翻转(即0和1互换),这样数据执行就会发生错误,如果是一般PC的软件或程序运行可能即使报错或者闪退,但是如果是重要系统出现该问题则会造成比较严重的后果(毕竟银行不想你的资产平白无故多几个0,你也不希望自己资产变少吧)。
那么ECC内存就应运而生了,主动发现数据中出现的数据错误,并予以纠正。
3 原理
这里先介绍两种比较原始的解决方案:
3.1 多副本传输
即一段数据传输3份,如果某一份的任意位置出现问题了,可以纠正:
但是问题也出现了,虽然出现的概率很低,如果有两份数据在同一个位置都发生了比特翻转,那么这份数据校验纠错就会出现问题:
而使用这种方式最大的问题还是浪费IO带宽。
3.2 纠错码
这种方式数据的开头添加一个纠错码,即在每一段数据前添加一个纠错码,当数据中1的数量为偶数则纠错码为0,奇数则纠错码是1。
如果纠错码与1的数量不匹配则重新传输这份数据。
这里也造成了一个问题,每次校验只能判断整份数据是否正常,理论上没有做到纠错,重新传输会增大延迟。
同时如果同时出现两位数据错误,则依然无法达到校验的目的。
3.3 汉明码
汉明码是目前ECC内存使用的主要校验纠错方式。
这里循序渐进一下,把一个16bit的数据按照下面的方式排布,假设2号位负责对右边部分进行奇偶校验,那么这份数据两个1,则2号位为0。如果数据出现错误,奇偶校验判定右半区没有问题,那么问题就在左半区了,反之问题就在右边。
如下图,1号位对2、4列进行奇偶校验,那么1号位存储则为1。如果2、4列奇偶校验出现问题,那么问题就在2、4列,反之是1、3列出现问题。
上面两种配合起来就能很好确认那一列数据出现了问题:
接下来使用类似的方式,用4号位校验2、4行,8号为校验下半区,通过行分列、分区奇偶校验就可以找到错误的具体位置,执行纠错(翻转)即可。
但是上面的判断前提是默认数据出现了问题,用上面的方法判断完成之后,0号的数据位是没有纳入保护中的,他的错误与否,不影响上面奇偶校验的结果。因此我们将0号位用3.2中的方式来校验整块数据。
这种情况下如果有两个错误,会出现全盘奇偶校验和分列分区奇偶校验结果相冲突,无法判断错误位置,但是可以判定位整块数据出现异常。重新传输数据即可。
但是当数据错误出现到3个时,就无法判断了。
换一种方式,我们会发现,校验码的位置都是2的N次方:
校验码只需要放在2的N次方位置上,那么块越大,纠错码占用的内容就更少,但是出现多位翻转的概率也就越大。一般的ECC传输块大小是72bit,64bit是数据,8bit是纠错码。因此一般8G容量的内存仅需要8块1G的内存颗粒,而ECC内存要达到8G容量就需要9块1G的内存颗粒,多的1G用于存储多出来的纠错码所占容量。
但是计算机校验纠错肯定不会如我们一般的“傻乎乎”的方式去计算错误位置,这里可以利用二进制的魅力来实现,我们把位置用二进制来表示:
我们将所有为1的位置拿出来,做个竖向二进制抑或运算,就可以直接得出有问题的位置:
附:还有一种LDPC(Low Density Parity-Check Code),即低密度奇偶校验码,具体实现原理这里就不做解释了,这种方式可以判断多位翻转的问题,常用于SSD的校验纠错。由于内存的高速和实现成本的特性,因此还是使用汉明码来实现ECC。
总结
本期简单介绍了ECC内存是如何实现校验纠错的。
老规矩,知道写了些啥。