free -h 的 Mem: 行 total 值即为最准的物理内存总量,是内核上报的运行时实际可用容量,已剔除显存、固件等保留内存;/proc/meminfo 需手动换算且含未启用区域,dmidecode 仅反映插槽硬件信息而非系统识别量。

free -h 的 Mem: total 就是你要的物理内存总量
别算 /proc/meminfo 里的 MemTotal,也别信 dmidecode 显示的插槽容量——free -h 输出中 Mem: 行的 total 值,才是内核当前实际识别并可用的物理内存大小。
这个值已经自动剔除了显存、固件保留区、PCIe BAR 空间等不可用区域,单位是 GiB(二进制),比如显示 15Gi,就约等于 16GB 物理内存。
-
free -h是 procps-ng 核心工具,几乎所有 Linux 发行版默认自带,无依赖、不需 root 权限 - 如果看到
total比你预期的小(例如标称 32G 却只报 31.2G),大概率是 BIOS 预留或集成显卡占用了部分内存,不是命令不准 - 别把
available或free当总量——它们是剩余可用量,和“总共有多少”完全不是一回事
grep MemTotal /proc/meminfo 要手动换算,且容易误读
/proc/meminfo 是权威数据源,但直接看它容易踩两个坑:单位是 KB,且未完全过滤未启用/保留内存区域。
执行 grep MemTotal /proc/meminfo 得到类似 MemTotal: 32941268 kB,必须手动换算:
- 除以
1024²→ ≈ 31.4 GiB(推荐,和free -h对齐) - 除以
1000²→ ≈ 32.9 GB(硬盘厂商式,会比真实可用多出近 1.5GB) - 某些 ARM 或嵌入式平台,该值可能包含 BIOS 未启用的内存块,
free已做裁剪,更贴近运行时实际
dmidecode 显示的是“插了什么”,不是“系统用了多少”
sudo dmidecode -t memory | grep -E "Size|Locator" 读取的是 SMBIOS 表,反映主板 BIOS 记录的硬件配置。
- 它可能显示
Size: 16 GB× 2,但若其中一根接触不良、BIOS 关闭了通道,或运行在单通道模式下,free -h仍只会报 16Gi - 在虚拟机里常返回
No SMBIOS nor DMI entry point found,此时完全不可用 - 需要 root 权限,容器环境或最小化系统(如 Alpine)通常不带
dmidecode
为什么不用 lshw 或 lsmem?
它们引入额外抽象层,字段含义模糊,反而增加判断成本。
-
lshw -class memory的size字段有时指单条容量、有时指总和,且默认不带单位,脚本解析易错 -
lsmem主要面向内存块(memory block)管理,常见于大页/热插拔场景,在普通服务器上输出字段(如SIZE,STATE)意义不直观 - 两者都依赖 udev/dbus,在容器、initramfs 或精简系统中常缺失;而
free只读/proc/meminfo,稳定可靠
真正要确认“物理内存总量”,盯死 free -h 的 Mem: → total。其他命令只适合交叉验证——比如 free 报 16Gi,dmidecode 却显示两根 16GB,那基本能断定有一根没被识别。


















