访存采样
访存采样记录内存访问操作本身,并区分访问类型与数据来源层级:命中的是哪一级缓存、还是不得不走到内存。相比只看「缓存未命中次数」,它能把热点落到具体的指令与访问来源上,用来判断内存带宽受限还是缓存局部性差。
基本信息
| 适用平台 | 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报告字段
| 字段 | 含义 | 判读要点 |
|---|---|---|
| 访问类型 | 加载或存储 | 读多写少的负载应聚焦加载 |
| 来源层级 | 命中位置或落到内存 | 高层级失败指向局部性差 |
| 符号 | 发起访问的函数 | 结合代码核对访问模式 |
| 占比 | 该条目样本比例 | 结合样本数判断稳定性 |
记录前先评估采样率与窗口:访存事件频率高,长时间记录会产生可观的数据量,也会给被观测进程带来额外负担。
访存热点与「占用高的函数」不是一回事:某个函数访问次数多未必是问题,真正的问题是它访问得低效;需要结合来源层级一起看。