乐趣区

关于组成原理:独家详解Intel主板下的『LockStep』内存模式以及为何开启它能让-ECC-内存比可靠更可靠

笔者有一台退役多年的 X79 芯片组台式机,装备了 E5-2680 处理器,因为最近须要降级更大容量的 ECC 内存,便为其刷入了新的 BIOS。在配置 BIOS 的过程中,忽然发现 BIOS 设置里多了一项内存模式,即题目中的 LockStep 模式,好奇心驱使下,笔者在搜索引擎中搜素 LockStep,却所获不多。本文将为读者分享我在摸索这一模式过程中的发现,以及解释该模式为什么能让 ECC 内存比牢靠更牢靠。
本文原载于未命名小站,由作者自己同步至 SegmentFault,转载请注明原作者博客地址或本链接,谢谢!

0x01 景象

首先介绍一下笔者的电脑配置:

CPU:Intel E5-2680
芯片组:X79
内存:4*8GB DDR3 ECC 1333MHz

如序言所述,笔者在 BIOS 的设置中找到了一个名为内存模式(Memory Mode)的选项,其中蕴含四项:

  • 独立(Independent)
  • 镜像(Mirroring)
  • 锁步(Lock Step)
  • 热备(Sparing)

独立、镜像、热备都十分直观,能够类比为磁盘阵列中的 JBODRAID10RAID 热备,但『锁步』是什么意思呢?

笔者抱着好奇心关上了 Lock Step 模式,重启后发现零碎一切正常,仍旧可能辨认 32GB 的内存,但存在两处奇怪的景象:

  1. Windows 辨认的内存插槽从 4*8GB 变成了 2*16GB,和物理内存不统一:

  1. 应用 AIDA64 对内存读写速度进行基准测试,读写速度均从 40GB/s 升高到了 20GB/s

以上景象仿佛表明,开启了 Lock Step 之后,相邻的内存被合并了,并且通道数也从 4 通道变成了 2 通道。

但这个模式到底有什么意义呢?为什么它会在不影响容量的状况下导致通道数降落,进而影响性能呢?它损失了性能,换取了什么呢?

0x02 摸索

1. 寻找思路

带着泛滥疑难,笔者关上了搜索引擎,尝试搜寻 Lock Step in Computer(因为 Lock Step 作为一个单词,其实和电脑没有关系,指的是军事上军人紧贴着同步前行的步调),却搜到了大量和内存无关的内容:

搜寻后果往往指向多处理器架构下的锁步模式,即保障不同处理器的时钟周期同步,避免出现竞态谬误。显然这不是咱们想要的。

于是笔者换了一个思路,尝试在中文互联网中搜寻 Lock Step,搜寻到了哔哩哔哩上的一篇文章:如何抉择内存模式?(Independent/Mirroring/Lock Step)区别与性能 – in a nutshell – 哔哩哔哩

相比笔者上文的发现,这篇文章只管写了很多,但仍旧只流于景象,并没有解释这个模式背地的原理。好在这篇文章并非一无是处,因为它提到了“安全性”和“高级 ECC”,这为咱们提供了摸索的方向。

也就是说,这个模式是只存在于 ECC 内存架构中,它损失了性能,带来更高的“安全性”,而对于 ECC 而言,安全性就是可靠性;此外,既然叫高级 ECC,也就阐明了它基于 ECC,但比 ECC 更牢靠。

2. 准确搜寻

找到了突破点,于是笔者开始着重搜寻 LockStep Memory ECC 关键词,搜寻到了这条 Wikipedia 页面:Lockstep (computing) – Wikipedia)。

笔者摘录其中较为要害的一部分:

Lockstep memory
See also: Chipkill

Some vendors, including Intel, use the term lockstep memory to describe a multi-channel memory layout in which cache lines are distributed between two memory channels, so one half of the cache line is stored in a DIMM on the first channel, while the second half goes to a DIMM on the second channel. By combining the single error correction and double error detection (SECDED) capabilities of two ECC-enabled DIMMs in a lockstep layout, their single-device data correction (SDDC) nature can be extended into double-device data correction (DDDC), providing protection against the failure of any single memory chip.24

简而言之:Lock Step 只是一个商业用语,无需钻牛角尖了解其字面意思,实质上是将一个内存通道的缓存线对半平分到两个内存条上,利用 ECC 内存条的纠错能力,能够在双内存条环境下将单设施数据纠正 (SDDC) 降级为双设施数据纠正(DDDC),以抵挡任何单个存储芯片的故障。

如果读者此时曾经感觉一头雾水:什么是缓存线?ECC 内存条提供了什么纠错能力?基于什么原理纠错?单双设施数据纠正是什么意思?为什么 DDDC 能够抵挡任何芯片的故障?没关系,笔者曾和你有一样的感触,尤其在应用上述关键词搜寻了大量的技术材料后,接下来就让咱们逐个剖析这些术语背地的含意。

0x03 剖析

1. 什么是缓存线

在理解缓存线之前,笔者心愿读者能了解 CPU 拜访内存的分层架构,如果不理解,举荐浏览这篇文章:计算机缓存 Cache 以及 Cache Line 详解 – 知乎。

很多书籍将 Cache Line 翻译成缓存线,会给人一种和流水线相似的错觉,但笔者认为 Cache Line 更应该被翻译为缓存行,即缓存数据的单元。该单元在 64 位处理器中个别是 64Byte,而两条内存共享一个缓存行,也就意味着逻辑上这两条内存能够被合并为一条,在 CPU 或内存控制器看来,这就是一根内存。

2. ECC 内存条

如果读者没有见过 ECC 内存条,去网上搜寻内存条的照片,找到最丑的那一根就是了:

如果说将芯片横竖搁置是为了尽量利用空间,尚且可能了解,但请读者数一数这根内存条上有多少颗芯片:19 颗!

是的,对于习惯了二进制的咱们而言,19 无疑是一个不谐和的数字,从标签上体现,这颗内存命名是 16GB 的内存,而搜寻颗粒信息咱们能够得悉,两头那颗芯片是 ECC 控制器芯片,而残余的 18 个颗粒均为容量 8Gbit,即 1GBit 的颗粒,加起来……明明是 18 呀?容量为什么只剩 16GB 了呢?残余的 2GB 到哪里去了呢?

3. ECC 内存条纠错的原理

要想晓得为什么 ECC 内存相比一般内存多出了几颗内存颗粒,就要先理解 ECC 内存条是如何纠错的。如果读者有计算机专业背景,且本科没有翘掉计算机组成原理的课程,应该无需笔者从新解释纠错和谬误检测的原理,但如果读者和笔者一样,一节计算机组成原理都没去上过,只在考试的时候见了老师一面的话,笔者还是违心翻出当年的书籍,来略微解释一下 ECC 内存条在纠错过程中波及的算法:

3.1 奇偶校验

奇偶校验,即 Parity Check,通常用于确定数据是否出错,能够被别离分为奇校验和偶校验,以奇校验为例:如果 8Bit 数据采纳 1Bit 奇校验,那么当数据为 10100010 时,奇校验后果应该为 1,因为这些数字有奇数个 1,反馈在电路上则是对比特进行异或运算取得奇偶校验的后果。

3.2 纠错码

纠错码,即 Error Correcting Code,其实是一类编码方式的统称,而在内存条中,业界通常会应用汉明码来存储多余的纠错位(其实在计算机网络和存储设备中也会应用同样的算法),在读取数据的时候计算读取出数据的汉明码,与内存中额定存储的汉明码进行比对,如果数据不统一,则阐明数据呈现谬误,此时再利用汉明码的排错原理,获取谬误的比特位,进行修复。

如果读者想要理解汉明码是如何检测谬误的,能够浏览这篇文章:汉明码——计算机网络——全网最艰深的解说_扬俊的小屋 -CSDN 博客_汉明码。

但因为计算汉明码速度慢于奇偶校验,因而个别不应用汉明码进行谬误检测,而是应用奇偶校验进行谬误检测,再应用汉明码复原特定 Bit 的谬误。

解释完 ECC 内存条纠错的原理,置信读者应该了解了为什么 ECC 内存条须要比个别内存条多一些颗粒了。业界个别会应用 16 个 Bit 为一个校验单位,这也就解释了为什么 16GBit 的内存条要应用 18GBit 的颗粒,其中一个颗粒用于存储汉明码,另一个颗粒则用于存储奇偶校验码,即 256Bits 数据最初在内存中的占用为 288Bits(256 + 16 + 16)。借用一张来自超微的说明书便于读者了解:

4. 什么是单设施数据纠正(SDDC)?

此处单设施是绝对双设施而言,读者能够将其了解为一根内存条内实现数据纠正,其纠错过程如下所示:

图中 D0 ~ D15 是存储颗粒,而 P 是奇偶校验颗粒,C 是纠错颗粒。此时咱们假如 D0 颗粒因为强电磁影响导致一个比特呈现了翻转,即数据呈现了谬误。

如果受影响的数据是笔者买煎饼果子的一笔钱,数目应用 64 位整数存储,其中的第 16 位从 0 变成了 1。在比特翻转的影响下,这笔数目可能会从 1000b 即 8 元,变成 1000000000001000b 即 32776 元:


因为整个交易系统中的一环呈现了谬误,这笔交易可能会呈现两种后果:携带领取金额的交易呈现签名校验谬误,或因为笔者的余额有余交易失败。但不论是哪一种,对于谋求可靠性的行业,如科学计算、金融、商业甚至是臭打游戏的咱们而言,都会带来极大的困扰。更别提比特谬误可能导致潜在的数据溢出问题,甚至可能导致微小的劫难:阿丽亚娜 - 5 运载火箭 – 维基百科,自在的百科全书。

但好在有始终在致力的数学家和科学家们,于是咱们有了 ECC 内存,也有了“不会溢出”的 Python 语言。回到 SDDC 上,如果有一个比特呈现谬误,那么在下次读取这个区域的时候,其奇偶校验值会呈现翻转,此时咱们能够应用汉明码找到呈现谬误的比特,并依照奇偶校验的预期后果对其进行修复。

5. 什么是双设施数据纠正(DDDC)?

ECC 内存加持下的 SDDC 仿佛可能修复由单个比特翻转导致的内存谬误,这很不错,但为什么这个颗粒会呈现比特翻转呢?会不会是因为这个颗粒曾经濒临损坏?每次呈现问题都进行修复是否会导致内存稳定性降落?或者如果呈现的不是比特翻转而是死比特,无论如何都无奈修改区域内的谬误,又该怎么办呢?难道就只能坐等数据失落,或应用低廉又迟缓的内存镜像吗?双设施数据纠正就是在 ECC 根底上用于解决内存颗粒生效的计划,它不仅能够保障一颗内存颗粒故障时的性能牢靠,还能保障两颗内存颗粒故障时的安全性。

6. 为什么 DDDC 能够抵挡任何两个颗粒的故障?

免责申明:下文小剧场纯属虚构,如有雷同,懂得都懂😄。

那么,古尔丹,代价是什么呢?为什么 DDDC 能够如此弱小,弱小到能抵挡两个颗粒的故障?本源在于 DDDC 充分利用两根内存条中可用的四块校验区域,使其可能承当多种职责。

通过上文那张超级丑的三星内存条照片,读者应该能看进去,尽管咱们人为给两个颗粒设定了校验和纠错的角色,但他们和一般的内存颗粒其实并无区别,上文解释汉明码的时候,有提到过其实汉明码兼有辨认谬误和纠错的能力,也就意味着奇偶校验在必要状况下能够被舍弃,但多必要算必要呢?一个颗粒呈现谬误,就要将谬误的颗粒迁徙到奇偶校验颗粒上,而后损失这根内存条的性能吗?DDDC 就是为了解决这个问题而呈现的一种架构:

能够看到,两条内存被搁置在一个 Buffer 里(即 Cache Line),其中内存条 0 的冗余颗粒全副用来存储两根内存条中的汉明码,而内存条 1 的冗余颗粒别离用于存储奇偶校验码(数据和校验位的比例翻倍)和冗余。

假如可怜的 D0 颗粒背负了无数次算错煎饼果子钱的锅后终于开始『摆烂』,触发了内存控制器的忍耐阈值,即“DDDC Device Sparing event”,此时内存控制器会命令 D0 颗粒赶快调岗,于是 D0 颗粒带着它最初一次修复的数据来到了新的场合(即冗余颗粒)上,如下图所示:

在冗余颗粒上的 D0 终于违心安分下来,但在 D0 旁边的 D1 看着 D0 搬进了新房子,却有些不均衡,也开始『摆烂』,触发大量的 ECC 纠错,再次导致“DDDC Device Sparing event”被触发,但此时曾经没有新房子能给 D1 住了,于是内存控制器认为保留奇偶校验颗粒带来的性能曾经不如保障数据安全重要了,命令奇偶校验颗粒立即滚蛋,将奇偶校验留下的职责交给 ECC 颗粒进行,只管 ECC 颗粒有苦难言,但它们的职责切实太重要,一旦请辞就会导致内存可靠性呈现问题,为了思考大局,只得勉强接下校验的工作,并报告系统管理员:咱俩要撑不住了,申请管理员留神并解决,否则后果自负!而 D1 此时曾经带着最初一次修复的数据住进了奇偶校验颗粒中,如下图所示:

只管此时该通道的数据安全和性能均处于大厦将倾的状态,但好在每个比特仍旧各司其职,只是如果管理员持续放任不管,就不会再有机会给第三个『摆烂』的内存颗粒了……

0x04 论断

置信笔者介绍到这里,读者应该能了解 BIOS 里那个 Lock Step 内存模式的意义了:在损失一半通道的前提下,保障内存容量不变,还能使得安全性极大晋升。

该模式在工作失常的时候对内存提早无影响,对内存容量无影响,对内存读写速度减半,对于个人用户而言,特地适宜对内存吞吐量要求不高或通道数较多的环境(如利用白菜价的 X79、X99 平台搭建工作站)。

在实现本文写作的过程中,笔者参考了来自互联网上的大量材料,还翻箱倒柜找到了一个字都没写过的,99 新计算机组成原理课本,恶补了当年脱漏的常识。此外还想真挚感激计算机组成原理给了我 61 分的某云华老师,毕竟他的课程随同了我大学生涯四年,只管我的签到记录比比皆是,但他从不记恨,甚至在毕业设计阶段最初一次高抬贵手,让我大学生涯最初一程走得同他之前教过我的每堂课一样顺利。

本文如有谬误或脱漏,纯属笔者程度无限,欢送在评论区斧正,笔者违心虚心接受并对本文进行必要的订正。


0x05 扩大浏览

  1. Lockstep (computing) – Wikipedia)
  2. Chipkill – Wikipedia
  3. Independent Channel vs. Lockstep Mode – Drive your Memory Faster or Safer | Intel® Developer Zone
  4. 如何抉择内存模式?(Independent/Mirroring/Lock Step)区别与性能 – in a nutshell – 哔哩哔哩
  5. Memory RAS Configuration User’s Guide 1.0.indd
  6. The Benefits of Chipkill-Protect for PC Server Main Memory
  7. 内存的可靠性、可用性和诊断性能(内存 RAS)- 宿迁波仔博客
  8. Parity(奇偶校验)和 ECC(谬误检查和纠正)_IC 小鸽的博客 - 程序员宅基地 – 程序员宅基地
退出移动版