什么是 ECC 内存,什么时候需要它
纠错内存到底拦得住什么,带寄存器与降载模块跟无缓冲模块差在哪,以及为什么决定 ECC 能否生效的是平台。
更新于
纠错内存是装机里少数几个「弄懂它做什么之后答案就很明显」的部分。它拦 的是一种具体而罕见的故障,代价是钱和一点延迟,而且只有三样东西同时到 位它才起作用。围绕它的大部分混淆,来自第四样东西——名字相近,却完全不 是同一个功能。
ECC 拦下的到底是什么
没有纠错的内存条会照你交代的样子存下每一位,之后你读什么它就给你什么。 偶尔它找到的东西和当初存进去的不一样:一颗杂散粒子翻转了一个单元,一 颗临界状态的颗粒漏掉了电荷,总线上的一个信号到达时已经变形。模块本身 无从知晓,于是错误的值被送到处理器,程序就照着它继续算。
ECC 模块在承载数据的颗粒之外还带有额外的内存颗粒,为每个字一并存下一 份校验。每次读取时,内存控制器都会重新计算这份校验。翻转一位会被当场 纠正并记录下来;翻转两位能被发现但纠正不了,机器会停下来,而不是带着 已知有错的数据继续跑。
留意它买到了什么,又没买到什么。纠错不会让内存更快,不会让它更耐用, 也救不了一根真正在坏掉的模块——它做的是把故障更早、更清楚地报出来,而 这往往比纠正本身更值钱。真正变化的是:一个悄无声息的错误答案变成了一 条有记录的事件,而这值不值得掏钱,完全取决于这台机器在做什么。一台跑 着长达一周仿真的工作站、一台存着五年后还要读回的数据的文件服务器、一 个绝不能写进错误行的数据库:对它们来说,没人察觉的一位翻转才是昂贵的 结局。游戏机崩了,你重启,损失几分钟。
片内 ECC 不是 ECC 内存
这是最容易把人绊倒的一段,而 DDR5 让情况更糟了。
每颗 DDR5 芯片都在裸片内部内建了纠错。这是标准的一部分,而不是某家厂 商额外加的东西——DDR5 出货的密度让阵列内部的位翻转频繁到必须在芯片内 部就地纠正,良率才撑得住。所以一套普通的台式机 DDR5 内存,从某种真实 的意义上说,确实带有纠错。
但它不是同一个功能。片内纠错覆盖的只是 DRAM 阵列内部的错误,别的一概 不管。它在数据离开芯片之前就完成工作,因此不覆盖从模块到内存控制器的 那一段路——触点、板上走线、总线本身——而相当一部分内存错误恰恰发生在 这段路上。它也什么都不报告:没有计数器可读,没有日志条目,操作系统无 从得知曾经发生过一次纠正,也无从得知纠正正在变得频繁。片内 ECC 是一项 顺带帮到你的制造措施;ECC 内存则是一项会把你自己硬件的真实状况告诉你 的系统功能。
结论很短:一根 DDR5 模块带片内纠错,并不能说明这台机器有没有 ECC 内存。 这是两个问题,答案也各自独立。
无缓冲、带寄存器、降载
纠错是一个维度。模块在电气上如何被驱动是另一个维度,两者常被混为一谈, 因为服务器内存通常两样都有。
在无缓冲模块上——台式机里的 UDIMM、笔记本里的 SO-DIMM——地址线和 命令线从内存控制器直接连到内存条上的每一颗 DRAM。这是最简单的接法,延 迟也最低。代价出在电气上:每一颗颗粒都是这些线上的一份负载,所以一个 通道挂的颗粒越多、模块越多,控制器就越吃力,信号也越早不再干净。这正 是台式机平台止步于寥寥几个插槽、每槽容量也有上限的原因。
带寄存器的模块——RDIMM——在连接器和 DRAM 之间放了一颗寄存器芯片。 控制器每根模块只驱动一份负载而不是几十份,再由寄存器把信号扇出去。这 要花掉地址与命令上的一个时钟周期,换来的是一个通道能挂载远超无缓冲设 计的内存量。
降载模块——LRDIMM——连数据线也一并缓冲。这消除了剩下的电气限制, 让容量最大、rank 最多的模块得以正常工作,而这也是接受额外成本的唯一理 由。
| 无缓冲 | 带寄存器 | 降载 | |
|---|---|---|---|
| 缓冲的对象 | 无 | 地址与命令 | 地址、命令与数据 |
| 延迟 | 最低 | 多一个时钟周期 | 多一个时钟周期 |
| 常见去处 | 台式机与笔记本 | 服务器与工作站主板 | 服务器主板上容量最大的那一档 |
这张表里没有一项是关于纠错的。带寄存器的模块几乎总是带纠错,因为接受 它们的平台需要它——但无缓冲的 ECC 模块是存在的,而且是很常规的零件。 我们的目录里就有若干根,它们排在台式机内存页而不是这一页上,因为决定 一根模块是否出现在服务器内存页上的只有它的板型:RDIMM 和 LRDIMM,这两 个写法意味着模块带缓冲。
拍板的是平台,不是模块
把一根 ECC 模块插进一台不支持 ECC 的机器,只会有两种结果:要么校验位被 忽略照常运行,要么根本起不来。无论哪种,你都为一个什么也没做的功能付 了钱。
必须同时具备三样东西。模块得带上那些额外颗粒。内存控制器——在如今的每 一个平台上它都住在处理器里面——得有能力去核对它们。固件和操作系统还得 把结果呈现出来,因为一次没人看得见的纠正,并不比没有纠正好多少。服务 器和工作站平台三样齐备。消费级台式机平台大多不是,而在某些台式机主板 与处理器确实支持无缓冲 ECC 的地方,这一点写在主板自己的文档里,而不是 由插槽本身暗示。文档才是这件事定下来的地方,而且值得在买模块之前就定 下来。
我们记录什么,不记录什么
我们把纠错支持记在模块上,作为一个规格书要么写了要么没写的字段。厂商 没写的地方,我们把这个字段留空,而不是从料号推断出来,所以字段为空的 意思是我们没有找到这项声明——不是这根模块没有这个功能。我们目录里每一 根带寄存器和降载的模块都写明了它,而笔记本 SO-DIMM 一根也没有。
它也不是我们拿来比较的东西。内存的比较建立在三个数字上——容量、以 MT/s 计的速度,以及 CAS 延迟,前两个越高越好,最后一个越低越好——纠错不在其 中任何一个里,因为它不是一个能排序的数字。一根模块要么带着那些额外颗 粒,要么没有,接下来的问题是你的平台用不用得上它们。模块也是本站唯一 记录纠错的地方:这里没有任何一条处理器或主板条目为它留出字段,所以这 个问题从规格书开始,到主板文档为止。
在读这份目录之前,还有两个习惯值得知道。服务器内存是按单根模块而不是 成套列出的,因为通道是按槽填充的,主板的插槽数才决定你要买几根。还有, 台式机内存会印出来的完整时序串,在这里每一根带寄存器的模块上都是缺席 的——厂商只公布 CAS 延迟,到此为止。
顺着这一点说:带寄存器的 DDR5 的 CAS 数字摆在 DDR4 旁边看着吓人,这里 每一根 DDR5 模块的数字都高于每一根 DDR4 模块。它们代表的等待时间大致相 当,因为速度越高,一个时钟周期就越短—— 速度和延迟如何一起起作用里有这笔账。 如果这一切底下真正的问题其实是买多大而不是买哪一种,那就 从容量开始,对绝大多数机器来说,它的影响远比纠 错大得多。
常见问题
- 用上 DDR5 是不是就等于有了 ECC 内存?
- 不是。每颗 DDR5 芯片都带片内纠错,处理的是自身存储阵列内部的错误,这是标准的一部分,而不是某一款模块的卖点。它不覆盖模块到处理器之间的链路,也不向操作系统报告任何东西,所以一台跑 DDR5 的台式机并不是一台装了 ECC 内存的机器。
- 能把带寄存器的 DIMM 插进台式机主板吗?
- 不能。主板是按某一种模块布线的,带寄存器的 DIMM 在台式机平台上根本起不来。连接器与内存颗粒之间的那颗寄存器芯片改变了主板驱动模块的方式,所以拍板的是主板和处理器,不是你买的那根内存条。