Linux无直接显示内存总线带宽的命令,free、vmstat等仅反映内存用量或页面活动;可用dmidecode估算理论带宽,perf或pcm-memory.x测实时DDR读写吞吐,但均受限于CPU架构与权限。

Linux没有直接显示内存总线带宽的命令
所有常见命令如 free、vmstat、top、sar 都不提供内存总线带宽(即 DDR 实际读写吞吐量),它们只反映内存用量或页面活动。试图从 /proc/meminfo 或 dmidecode 里“找带宽字段”注定失败——这些工具压根不采集硬件级字节传输速率。
用 dmidecode 算理论最大带宽(仅参考)
这是唯一能快速估算上限的方法,但结果是静态理论值,不代表当前负载下的真实吞吐:
-
sudo dmidecode -t memory | grep -i "speed\|type"查出内存类型(如 DDR4)和标称速率(如 2666 MT/s) - 确认通道数:
sudo lshw -class memory | grep -A 5 "bank:"看有几个 bank,或查主板手册 - 按公式算:单通道带宽 ≈
speed(MT/s) × 64(bit) ÷ 8(单位 MB/s);双通道再 ×2 - 例如 DDR4-2666 单通道:2666 × 8 = ~21328 MB/s ≈ 21.3 GB/s;双通道约 42.6 GB/s
注意:dmidecode 中的 Speed 值可能被 BIOS 错报(尤其超频/降频后),且无法反映实际运行时的通道利用率或降频行为。
用 perf 测实时 DDR 读写带宽(需 root + CPU 支持)
这是最接近真实值的方式,依赖 CPU 内存控制器性能计数器(Intel uncore_imc / AMD mem_load_retired),不是所有 CPU 都支持:
Linux 安全审计工具,检查 SSH 配置、开放/监听端口、防火墙规则(ufw/iptables/nftables)、失败登录尝试、sudoers 权限...
- 先确认事件可用:
sudo perf list | grep -i "memory\|imc",找类似uncore_imc_00/event=0x04,umask=0x0f/(读)和event=0x05(写)的项 - 采样 1 秒一次,持续 5 秒:
sudo perf stat -e uncore_imc_00/event=0x04,umask=0x0f/,uncore_imc_00/event=0x05,umask=0x0f/ -I 1000 -a sleep 5 - 输出中两列数字是 bytes,除以 1024² 得 MB/s;若有多 socket,
-a只汇总 socket 0,要全量得手动遍历uncore_imc_01等 - 常见坑:Skylake 和 Ice Lake 的事件编码不同,硬套会报错;ARM 或老 Atom 平台基本不支持
用 pcm-memory.x 快速看摘要(Intel 专用)
比 perf 更友好,但只支持 Intel 处理器,且对新平台(如 Sapphire Rapids)需编译新版 PCM:
- 下载编译:
git clone https://github.com/opcm/pcm && cd pcm && make - 运行:
sudo ./pcm-memory.x 1,每秒刷新 - 关键字段:
MEM READ和MEM WRITE列就是当前 GB/s 级别带宽,顶部还显示Max Memory Bandwidth - 限制:不支持 AMD;部分笔记本平台因 BIOS 锁定 uncore 计数器而无法读取;输出不含 per-channel 拆分
真正难的是区分“理论带宽”“实际吞吐”和“瓶颈位置”——同一块 DDR4-3200 内存,在 NUMA 跨节点访问时,有效带宽可能只有本地节点的 60%,而 pcm-memory.x 和 perf 都不会自动告诉你这个差异藏在哪条链路上。










