最准的内存信息只能从BIOS/UEFI固件读取,dmidecode -t memory是唯一能直接获取原始SPD数据的命令;其Speed字段为空或Unknown主因是固件未填全、插槽空置或跨Handle错配,需按Handle边界解析并过滤无效条目。

最准的内存品牌和频率信息只能从 BIOS/UEFI 固件里读,dmidecode -t memory 是唯一能直接拿到原始 SPD 数据的命令;其他工具要么字段缺失,要么容易误读。
为什么 dmidecode -t memory 的 Speed 字段经常为空或 Unknown
不是命令写错了,是固件没填全或你没筛对块。常见原因有三个:
- BIOS/UEFI 未把 SPD 数据完整写入 SMBIOS 表——多见于老旧主板、部分笔记本(尤其是 OEM 品牌机)和虚拟机
- 插槽物理空置,但
dmidecode仍列出该条目,Size:显示No Module Installed,连带Speed:、Part Number:全失效 - 厂商把
Speed:放在子Handle(如Handle 0x001B),而主Handle(如Handle 0x001A)只含Slot:和Type:,直接grep Speed:会跨块错配
验证是否真插了内存:先运行 sudo dmidecode -t memory | grep -A2 -B2 "Size:.*[MG]B"。只要看到类似 Size: 16 GB 的行,就说明该插槽有物理内存,再查它的 Speed 才有意义。
怎么可靠提取每根内存的 Slot、Size、Part Number 和 Speed
单层 grep 容易把 A 插槽的 Part Number: 和 B 插槽的 Speed: 拼在一起,必须按 Handle 边界切分每个内存设备块。推荐这条实操命令(已在 2026 年主流发行版验证):
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"
它做了三件事:
- 自动识别每个
Handle起始,确保Slot:、Size:、Part Number:、Speed:来自同一物理内存条 - 只匹配以
Size: N GB结尾的行,排除No Module Installed或Size: 0 MB等无效值 - 末尾
grep -v "No Module Installed"过滤空插槽,避免干扰输出
典型输出:Slot: CHANNELA-DIMM0 Size: 16 GB Part Number: M471A2K43CB1-CTD Speed: 3200 MT/s
Speed: 和 Configured Memory Speed: 到底哪个才算数
Speed: 字段反映的是内存条标称能力(JEDEC SPD 值),而 Configured Memory Speed: 才是 BIOS 实际配置的运行频率——它受 CPU 内存控制器、主板限制、XMP/EXPO 开关状态和双通道匹配影响。
- 一条标称 3200MHz 的内存,在 B550 主板上可能只显示
Configured Memory Speed: 2933 MHz,这不是故障,是降频适配 - 多条混插时,系统按最低那条的
Configured Memory Speed运行 -
Configured Memory Speed:只在已插内存的条目中存在;空槽位不会显示此行 - 部分老主板(如 Intel C226 芯片组)可能显示
Unknown,此时可补用sudo decode-dimms(需 i2c-dev 支持)或sudo lshw -class memory查clock:字段(注意单位是 Hz,需换算)
真正容易被忽略的是:虚拟机里基本查不到真实内存频率。KVM/QEMU、VMware、VirtualBox 默认不透传 SMBIOS 内存信息,dmidecode -t memory 在客户机中通常只显示 Not Specified 或固定值(如 667 MHz)。宿主机上查才有意义。


















