linux无标准内存带宽指标,需用perf或intel pcm等工具通过硬件性能计数器测量dram读写速率,free/vmstat仅反映内存用量与页面活动,无法体现实际字节传输吞吐。

Linux 没有直接暴露“内存带宽利用率”的标准指标,/proc/meminfo 和 free 不提供带宽数据,也不能用 iftop 或 nload 查——那是网络带宽。 真正监控内存访问吞吐(即 DRAM 读写速率),必须依赖硬件性能计数器或内核级采样工具。
为什么 free、vmstat 无法反映内存带宽
这些命令只统计内存“用量”(如 MemAvailable)或页面级活动(如 pgpgin/pgpgout),不测量物理内存控制器上的实际字节传输速率。例如:
-
vmstat 1中的si/so(swap in/out)是交换页流量,不是内存带宽 -
cat /proc/meminfo | grep -i "pg"显示缺页次数,属于延迟指标,非吞吐量 - 即使
available剩余很多,若程序密集随机访问大内存块,仍可能打满内存带宽,但free完全看不出
用 perf 监控 DDR 实际读写带宽
perf 是最接近硬件层的通用方案,需 CPU 支持内存控制器事件(Intel 有 uncore_imc,AMD 有 mem_load_retired 等)。以 Intel 为例:
Linux系统管理专家,覆盖12大模块:用户权限、SSH、存储、网络、systemd、防火墙、日志监控、备份恢复、TLS证书、Ansible、容器、IaC。提供配置、验证、加固、监控、备份、自动化、故障排查、回滚闭环。关键词:useradd、sudo、sshd_config、chmod、SEL...
- 确认支持:运行
perf list | grep -i memory,查找类似uncore_imc_00/event=0x04,umask=0x0f/的项(表示 DDR 读带宽) - 单次采样(单位 MB/s):
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)
- 限制:需 root 权限;不同 CPU 型号事件名差异大(如 Skylake vs. Ice Lake),不能硬套
用 pcm-memory.x 快速获取带宽摘要
Intel PCM(Processor Counter Monitor)工具链提供更友好的封装,pcm-memory.x 可直接输出内存控制器吞吐:
- 安装:从 https://github.com/opcm/pcm 下载源码编译,或用包管理器(如 Ubuntu:
sudo apt install intel-cmt-cat,但完整 PCM 需手动装) - 运行:
sudo ./pcm-memory.x 1(每秒刷新) - 关键字段:
MEM READ和MEM WRITE列即当前 GB/s 级别带宽,顶部还显示总带宽上限(如 “Max Memory Bandwidth: 51.2 GB/s”) - 注意:仅支持 Intel 处理器;部分新平台(如 Sapphire Rapids)需更新 PCM 版本才能识别正确事件
容易被忽略的复杂点
内存带宽不是单一数值:多通道内存下各 channel 独立计数,NUMA 节点间跨节点访问会额外增加延迟和隐性带宽竞争;perf 默认只采集 socket 0,要监控全部需加 -a 并手动解析每个 uncore_imc_* 实例。没有 root 权限、CPU 微码过旧、内核未启用 perf_event_paranoid=0,都会让所有采样返回 0 或报错 Operation not permitted——这不是工具问题,而是权限/固件/内核配置三重门槛。










