
最近我们一直在讨论如何搭建新的VPS或独立服务器。具体讨论的主题包括:
在今天的文章中,我们将介绍动态随机存取存储器(DRAM 或简称 RAM)和纠错码存储器(ECC RAM 或简称 ECC 存储器)之间的区别。我们将使用 Hetzner 最便宜的 Ryzen 服务器——AX41-NVMe 服务器,来测试我们选配的 ECC RAM 是否已安装并正常工作。
什么是ECC内存?
台式机、笔记本电脑、服务器和手机都包含几种不同类型的内存。内存类型之间的一个重要区别在于它是否能在断电重启后正常工作。断电重启后数据仍然保留的内存称为“静态”内存,而断电后数据会“丢失”的内存称为“动态”内存。存储我们数据的硬盘驱动器就是静态的。当我们关闭设备再重新启动时,我们的文件仍然可用。
我们或许会觉得设备中的所有内存都应该是静态的,但这其实很理想,因为静态内存速度太慢。设备运行时,我们不希望等待。因此,大多数计算机操作都使用动态内存,因为它比静态内存快得多。通常,设备会配备动态随机存取存储器(DRAM)模块。设备上运行的程序可以快速访问这些DRAM模块。
DRAM易受辐射和其他因素的影响,这些因素会导致存储和“记忆”的数据发生随机变化。这些变化被称为“位翻转”。当一个位发生翻转时,从内存中调用数据时所存储的内容与最初保存的内容不同。预期变化的后果取决于具体情况,但其影响范围可能从几乎无影响到灾难性后果。
纠错码存储器(“ECC RAM”)通过提供额外的内存模块来“监视”并报告或有时纠正内存错误,从而起到补救作用。
我们需要ECC内存吗?
我们是否需要ECC内存尚存争议。Linus Torvalds曾说过“ECC绝对重要”。另一方面,我们大多数人一直都在使用非ECC内存,而且几乎没有或根本没有明显的负面影响。非ECC内存更便宜,谁又会在意偶尔一次系统崩溃呢?我们又不是用廉价的VPS或服务器来控制飞机或其他需要类似精度和可用性的应用。
但是,对于专业网站而言,宕机和数据损坏都可能造成严重问题。这就是为什么“专业”配置都配备ECC内存的原因。ECC内存的价格并没有贵多少。
我们的服务器是否配备了ECC内存?
如果我们租用一台服务器,而供应商声称它配备了 ECC 内存,我们如何才能确定这是否属实呢?一种方法是查看我们之前提到的 ECC 内存特有的额外内存模块。我们可以使用dmidecode工具来检查是否安装了 ECC 内存。
root@hels ~# dmidecode -t memory
dmidecode 3.3
Getting SMBIOS data from sysfs.
SMBIOS 3.3.0 present.
句柄 0x000F,DMI 类型 16,23 字节
物理存储阵列
位置:系统板或主板
用途:系统内存
纠错类型:多位纠错码
最大容量:128 GB
错误信息句柄:0x000E
设备数量:4
[ , , , ]
句柄 0x0019,DMI 类型 17,92 字节
存储设备
数组句柄:0x000F
错误信息句柄:0x0018
总宽度:72 位
数据宽度:64 位
容量:32 GB
外形尺寸:DIMM
设置:无
插槽:DIMM 1
银行定位器:P0 通道 A
类型:DDR4
类型详情:同步无缓冲(未注册)
速度:2667 吨/秒
制造商:三星
序列号:XXXXXXXX
资产标签:未指定
零件编号:M391A4G43AB1-CWE
排名:2
配置内存速度:2667 MT/s
最低电压:1.2 伏
最大电压:1.2伏
配置电压:1.2V
内存技术:DRAM
内存操作模式能力:易失性内存
固件版本:未知
模块制造商 ID:Bank 1,十六进制 0xCE
模块产品 ID:未知
内存子系统控制器制造商 ID:未知
内存子系统控制器产品 ID:未知
非挥发性尺寸:无
易失性大小:32 GB
缓存大小:无
逻辑大小:无
[ , , , ]
root@hels ~#
上述输出表明系统主板已配置为处理“纠错类型:多位 ECC”。此外,从“总宽度:72 位”这一行可以看出,该已安装的模块中存在用于支持 ECC 的额外内存。72 位总宽度与“数据宽度:64 位”形成对比,多余的位用于 ECC。
这台服务器安装了两个内存模块。第二个模块也显示为 72 位宽。因此,我们可以得出结论,这台服务器似乎支持 ECC 内存,并且确实安装了 ECC 内存。
如何确定我们的ECC RAM是否正常工作?
Linux 内核会在启动时打印启动信息。我们可以使用 `dmesg` 命令查看这些启动信息。在内核中,ECC 模块被称为错误检测与纠正(EDAC)。我们可以检查并确认内核认为 ECC 工作正常,因此内核初始化了 EDAC。
root@hels ~ # dmesg | grep EDAC
[ 0.466382] EDAC MC: Ver: 3.0.0
[ 4.176346] EDAC amd64: MCT channel count: 2
[ 4.176542] EDAC MC0: Giving out device to module amd64_edac controller F17h_M70h: DEV 0000:00:18.3 (INTERRUPT)
[ 4.176669] EDAC amd64: F17h_M70h detected (node 0).
[ 4.176752] EDAC MC: UMC0 chip selects:
[ 4.176754] EDAC amd64: MC: 0: 0MB 1: 0MB
[ 4.176832] EDAC amd64: MC: 2: 16384MB 3: 16384MB
[ 4.176835] EDAC MC: UMC1 chip selects:
[ 4.176836] EDAC amd64: MC: 0: 0MB 1: 0MB
[ 4.176836] EDAC amd64: MC: 2: 16384MB 3: 16384MB
[ 4.176837] EDAC amd64: using x16 syndromes.
[ 4.176844] EDAC PCI0: Giving out device to module amd64_edac controller EDAC PCI controller: DEV 0000:00:18.0 (POLLED)
[ 4.176845] AMD64 EDAC driver v3.5.0
root@hels ~ #
我们的ECC系统运行情况如何?
这确实是个棘手的问题!我们如何才能发现那些随机的、不常发生的错误呢?当然,这些错误可能还没发生。目前我尝试使用edac-utils和rasdaemon 进行监控。我的监控时间并不长,系统规模也不大。我还没有尝试过高负载和超频来测试内存压力。我不确定目前没有发现任何问题,是因为系统本身没有出现任何问题,还是我的监控方法存在操作失误。
优惠链接
这里提供一个方便的链接,指向Hetzner 的 AX41-NVMe 页面,方便有兴趣的朋友查看。需要注意的是,ECC 内存是这款服务器的选配项,需要额外支付少量费用。