dmidecode -t memory是唯一能直接读取bios/uefi固件中spd数据的命令,提供最准确的内存型号、频率(speed:字段)、插槽位置(locator:)等硬件信息;其他工具如lshw或/proc/meminfo均无法提供完整spd详情,且必须加sudo执行,虚拟机中通常无效。

dmidecode -t memory 是唯一能直接读 BIOS 固件里 SPD 数据的命令
其他工具比如 lshw、/proc/meminfo 或 free 都不包含真实频率和插槽位置,它们要么只报总线时钟(易误读),要么压根没字段。只有 dmidecode -t memory 直接解析 SMBIOS 表,字段如 Speed:、Locator:、Part Number: 全来自 BIOS/UEFI 固件,最准。
但必须加 sudo,否则报 Cannot access SMBIOS data;虚拟机里基本无效,因为 SMBIOS 内存信息通常不透传。
-
Speed:字段单位可能是MT/s(DDR4/DDR5 标称值)、MHz或ns,看到3200 MT/s就是 DDR4-3200 -
Locator:是物理插槽名,常见值如CHANNELA-DIMM0、DIMM_A1,不同主板命名差异大,但重复出现的值数量 ≈ 总槽数 - 空插槽也会被列出,
Size:显示No Module Installed,不能只看输出块数就当“有内存”
grep 会拼错字段,必须按 Handle 分组提取
用 grep Speed: 然后手动对齐 Slot: 和 Part Number:?这是最常踩的坑——dmidecode 输出里不同内存条的字段可能跨块混排,grep 会把 A 槽的 Part Number: 和 B 槽的 Speed: 拼在一起。
正确做法是用 awk 按每个 Handle 起始切分,确保同一内存条的字段不串:
sudo dmidecode -t memory | awk '/^Handle / {if (size && speed && part) print slot, size, part, speed; slot=""; size=""; speed=""; part=""} /Slot:/ {slot=$0} /Size: [0-9]+ [MG]B$/ {size=$0} /Part Number:/ {part=$0} /Speed:/ {speed=$0} END {if (size && speed && part) print slot, size, part, speed}' | grep -v "No Module Installed"
- 只匹配以
Size: N GB结尾的行,排除No Module Installed和Size: 0 MB - 自动跳过空槽,不污染结果
- 典型输出:
Slot: CHANNELA-DIMM0 Size: 16 GB Part Number: M471A2K43CB1-CTD Speed: 3200 MT/s
Configured Memory Speed 才是真实运行频率
Speed: 字段反映的是内存条标称能力(JEDEC SPD 值),而 Configured Memory Speed: 才是 BIOS 实际配置的运行频率——它受 CPU 内存控制器、主板限制、XMP/EXPO 开关状态和双通道匹配影响。
- 一条标称 3200MHz 的内存,在 B550 主板上可能只显示
Configured Memory Speed: 2933 MHz,这不是故障,是降频适配 - 多条混插时,系统按最低那条的
Configured Memory Speed运行,dmidecode会为每条单独列出该字段 - 老主板(如 Intel C226)可能显示
Unknown,此时可补查sudo decode-dimms(需装i2c-tools)读 SPD 芯片
lshw 和 /sys/firmware/dmi/tables/ 是备用方案
当 dmidecode 报 Permission denied 或全是 Not Specified,说明 BIOS 没填全 SMBIOS 表或权限异常,这时换路径:
-
sudo lshw -class memory:输出结构清晰,重点看clock:字段(单位 Hz),例如clock: 1600000000→ 实际等效频率是 DDR4-3200;但注意它显示的是总线时钟,不是标称值 -
sudo strings /sys/firmware/dmi/tables/DMI | grep -A5 -B5 "Part Number\|Speed":不依赖dmidecode二进制,直接从内核暴露的 DMI 二进制表里抽字符串,适合容器或精简系统 - 别信
lscpu | grep memory,它只报 CPU 内存控制器支持上限(如Memory controller: 3200 MHz),不代表当前插着的内存真跑这么快
真正卡住的往往不是命令怎么写,而是 BIOS 没填 SPD、空槽干扰、或者你正跑在虚拟机里——这些情况下,dmidecode 输出再漂亮也没意义。











