首页/系统/Linux 内核与性能调优速查/perf mem 内存访问采样

perf mem 内存访问采样

对访存进行采样, 区分加载/存储来源与层级, 支持内存带宽与缓存侧问题定位。

访存采样

访存采样记录内存访问操作本身,并区分访问类型与数据来源层级:命中的是哪一级缓存、还是不得不走到内存。相比只看「缓存未命中次数」,它能把热点落到具体的指令与访问来源上,用来判断内存带宽受限还是缓存局部性差。

基本信息

适用平台Linux,依赖硬件性能计数器
采集范围可按进程、按处理器范围限定
访问类型可只记录加载或只记录存储
报告方式按访存类型与符号聚合
数据量随采样率与窗口时长增长

典型使用场景

  • 大内存应用吞吐受限,需要确认是否卡在末级缓存。
  • 验证数据结构或访问顺序改动是否减少缓存未命中。
  • 定位随机访问造成的低效:热点集中在少数访存指令上。
  • 区分读多写少型负载中的实际瓶颈来源。
  • 与整体效率指标配合,确认访存是否为限制因素。

记录与查看

记录与查看
perf mem record -p 12345 -- sleep 10              # 记录指定进程的访存
perf mem record -t load -p 12345 -- sleep 10      # 只记录加载操作
perf mem record -C 0-3 -- sleep 10                # 限定处理器范围
perf mem report --stdio | head -30                # 默认聚合视图
perf mem report --stdio --sort mem,symbol | head -30   # 按来源层级与符号排序
perf mem report --stdio --sort symbol --percent-limit 1 | head -20

报告字段

字段含义判读要点
访问类型加载或存储读多写少的负载应聚焦加载
来源层级命中位置或落到内存高层级失败指向局部性差
符号发起访问的函数结合代码核对访问模式
占比该条目样本比例结合样本数判断稳定性
记录前先评估采样率与窗口:访存事件频率高,长时间记录会产生可观的数据量,也会给被观测进程带来额外负担。
访存热点与「占用高的函数」不是一回事:某个函数访问次数多未必是问题,真正的问题是它访问得低效;需要结合来源层级一起看。

易错点

  • 采样率过高扰动被测进程,观测值失去代表性。
  • 把访存热点与占用高的函数直接等同,优化做在错误的位置。
  • 不区分加载与存储,读者与写者混在一起,看不出访问模式差异。
  • 窗口与业务峰值错位,采到的是活跃度低时段的分布。
  • 忽略硬件与权限限制导致记录为空,却当成「没有内存问题」。

数据来源与参考

  • man perf-mem
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌