大家好,我是飞哥!
现在很多软件开发同学对硬件了解甚少,例如对于内存往往只知道有几个 GB 容量。其它参数一概不知,我觉得这个不太好。还是应该对运行自己程序的硬件有更为详细的了解的。
今天就来带大家更详细地了解下自己的内存硬件信息。
如果你手头真的有一台刀片服务器,查看内存硬件相对比较容易。打开机箱盖子直接看就行了。内存从硬件上,看到的是一根根有着金手指的硬件。安装在 CPU 的周围的内存插槽中。
但一般来说,我们的服务器都是托管在 IDC 机房的。我们想拆开机盖看,这事不太可能。幸运的是 Linux 上提供了 dmidecode 命令可以让我们方便地查看服务器中内存的安装情况。
该命令中可以输出主板上所有的内存插槽,以及插槽上安装的内存条的一些详细信息,所以输出比较长。以下我先把其中一条内存的输出结果展示出来。
# dmidecode
......
Memory Device
Handle 0x0039, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x0031
Error Information Handle: Not Provided
Total Width: 72 bits
Data Width: 64 bits
Size: 32 GB
Form Factor: DIMM
Set: None
Locator: DIMM 1
Bank Locator: P0 CHANNEL A
Type: DDR4
Type Detail: Synchronous Registered (Buffered)
Speed: 2933 MT/s
Manufacturer: Samsung
Serial Number: 440FEB5D
Asset Tag: Not Specified
Part Number: M393A4K40DB2-CVF
Rank: 2
Configured Memory Speed: 2933 MT/s
Minimum Voltage: 1.2 V
Maximum Voltage: 1.2 V
Configured Voltage: 1.2 V
Memory Technology: DRAM
Memory Operating Mode Capability: Volatile memory
Firmware Version: Unknown
Module Manufacturer ID: Bank 1, Hex 0xCE
Module Product ID: Unknown
Memory Subsystem Controller Manufacturer ID: Unknown
Memory Subsystem Controller Product ID: Unknown
Non-Volatile Size: None
Volatile Size: 32 kB
Cache Size: None
Logical Size: None
......
通过 dmidecode 以上的输出可以看到,这个内存条的如下一些关键信息。
位宽信息:
目前的服务器的 CPU 和内存基本都是 64 位的。数据位宽 Data Width 这一列显示了内存的位宽是 64。也就是说一次 IO 并行能提供 64 bits 的数据。
但要注意到 Total Width 是 72 bits。说明因为服务器内存为了规避电子干扰带来的比特翻转问题,需要错误检查和纠错的 ECC 功能。而 ECC 内存需要 8 bit 冗余存储位来进行数据的校验和纠错。所以内存实际一次 IO 提供的位宽是 64 + 8 = 72 bits。
容量信息:
Size 这一行的输出是这条内存的容量情况,结果中的 32 GB 是这条内存可以存储的字节数。关于容量还要注意到 Type Detail 这一行输出的 Synchronous Registered (Buffered) 。这表明这是一个带寄存器颗粒的内存。正因为是带了寄存器颗粒,所以这条内存可以做到 32 GB 的大容量。
内存代际:
内存根据发展的阶段来看,分 DDR、DDR2、DDR3、DDR4 等几个代际,最新还有 DDR5 也出来了。另外就是在内个代际的内部,又细分成了不同的频率规格。
dmidecode 输出中的 Type 行表明了这是一条 DDR4 的内存, Speed 行的输出表明这个内存的数据频率是 2933 MT/s。
通道位置
之前我们说过,服务器 CPU 都有多个通道的。比如下图是某颗服务器 CPU 的通道数是 6 个,每个通道可以连接 2 个内存条。
dmidecode 输出中也包含了通道的信息。 Bank Locator 这一行显示了内存条是连接到 CPU 的哪个通道上的。上面例子中的内存条是连接到 P0 这个 CPU 的 CHANNEL A 通道上的。
实际上这颗 CPU 总共有 CHANNEL A、CHANNEL B、CHANNEL C、......、CHANNEL H 总共 8 个通道。每个通道上都支持连接 2 个这样的内存条。但要注意的是,并不是所有的插槽都会安装内存,有可能会空置。比如在我手头的这台机器中,P0 CHANNEL A 就只连接了一条内存。
Handle 0x0038, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x0031
Error Information Handle: Not Provided
Total Width: Unknown
Data Width: Unknown
Size: No Module Installed
Form Factor: Unknown
Set: None
Locator: DIMM 0
**Bank Locator: P0 CHANNEL A**
......
Handle 0x0039, DMI type 17, 84 bytes
Memory Device
Array Handle: 0x0031
Error Information Handle: Not Provided
Total Width: 72 bits
Data Width: 64 bits
Size: 32 GB
Form Factor: DIMM
Set: None
Locator: DIMM 1
**Bank Locator: P0 CHANNEL A**
......
P0 CHANNEL A 的第一个内存条的数据包括 Total Width、Data Width 等字段都是空的,表示没有安装内存条。在 P0 的 CPU 上每个通道都是空着一个插槽,使用一个插槽。
这个服务器有 P0 和 P1 两颗 CPU,P1 这个 CPU 也有 CHANNEL A、CHANNEL B、CHANNEL C、......、CHANNEL H 共 8 个通道。插槽使用方式和 P0 一样。
所以这台服务器上总共就安装了 2 * 8 * 32 GB 的物理内存,总大小是 512 GB。
另外在 dmidecode 的输出中还有 Rank 数量 为2,表示每个内存条都有 2 个 Rank。工作电压 为 1.2 v。
不过 dmidecode 总归只是一个软件显示,并不是万能的。比如内存颗粒有多少个,延迟参数是怎么样的,dmidecode 就无能为力了。需要结合内存的信息到官网上去搜索。