一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

Linux如何查看具体的系统内存带宽利用率

时间:2026-07-19 07:03:48 编辑:袖梨 来源:一聚教程网

Linux无标准内存带宽利用率指标,/proc/meminfo、free、vmstat仅反映内存用量与页面活动,无法测量DRAM实际读写速率;需用perf(依赖CPU型号查uncore事件)或Intel PCM的pcm-memory.x获取实时GB/s级带宽。

Linux 没有“内存带宽利用率”这个现成指标,/proc/meminfofreevmstat 都不提供它——它们只告诉你用了多少内存、换了多少页,而不是内存控制器上每秒实际传输了多少字节。

perf stat 能测 DDR 实际读写速率,但事件名得按 CPU 型号找

Intel 平台最通用的方式是用 perf 直接读取内存控制器(uncore)性能计数器。关键不是硬记命令,而是先确认当前 CPU 支持哪些事件:

  • perf list | grep -i memory 查看可用事件,重点关注类似 uncore_imc_00/event=0x04,umask=0x0f/(DDR 读)和 uncore_imc_00/event=0x05,umask=0x0f/(DDR 写)的条目
  • 不同微架构事件编码不同:Skylake 和 Ice Lake 的 event code 不一样,硬套会报 event is not supported
  • 单次采样示例:sudo perf stat -e uncore_imc_00/event=0x04,umask=0x0f/,uncore_imc_00/event=0x05,umask=0x0f/ -I 1000 -a sleep 5,输出里两列数字分别是采样周期内读/写字节数,除以时间再 ÷1024² 得 MB/s
  • 默认只监控 socket 0;多路服务器要加 -a 并手动解析每个 uncore_imc_* 设备(比如 uncore_imc_01

pcm-memory.x 输出可读带宽摘要,但只支持 Intel 且版本敏感

Intel PCM 工具链里的 pcm-memory.x 是最接近“开箱即用”的方案,但它不是系统自带,也不兼容 AMD:

  • 必须从 GitHub opcm/pcm 下载源码编译,apt install intel-cmt-cat 不包含完整 PCM
  • 运行 sudo ./pcm-memory.x 1 后,直接看 MEM READMEM WRITE 列,单位是 GB/s;顶部还会显示理论峰值(如 Max Memory Bandwidth: 51.2 GB/s
  • Sapphire Rapids 等新平台需用 PCM v5.13+,旧版会把带宽读成 0 或报错 Failed to detect memory controller
  • 它默认聚合所有内存通道,但不区分 NUMA 节点——跨节点访问的实际延迟和隐性竞争,pcm-memory.x 完全不体现

free/vmstat 的“内存使用率”和带宽毫无关系

很多人误以为 free -havailable 接近 0 就说明带宽被打满了,这是典型混淆:

  • freeused 是内核统计的“已分配页”,不含硬件层面的突发访存压力
  • 一个只占 2GB 物理内存的程序,如果做密集随机访问(如 hash join + 大 buffer pool),照样能打满 DDR 带宽,但 free 显示一切正常
  • vmstatsi/so 是 swap I/O,bi/bo 是块设备 I/O,两者都和内存控制器吞吐无关
  • 真正相关的是硬件事件:DRAM read/write cycles、memory controller queue depth——这些只能靠 perf 或 PCM 抓

内存带宽不是单一数值:多通道下各 channel 独立计数,NUMA 架构中跨节点访问会引入额外延迟和隐性带宽争抢,而绝大多数工具默认只报告 socket 0 或聚合值,容易掩盖真实瓶颈点。

热门栏目