为什么perf_event_open使用PERF_SAMPLE_DATA_SRC时记录缓存未命中层级?
关于perf PERF_SAMPLE_DATA_SRC采样仅上报未命中层级的说明
你观察到的采样结果仅展示未命中层级、无对应最终命中层级信息的现象,是x86架构性能监控单元(PMU)的硬件实现特性,和perf上层封装逻辑无关,核心原因如下:
- 采样事件本身是未命中触发:你用于触发采样的硬件事件默认是缓存未命中类事件(比如
L1-dcache-load-misses、LLC-load-misses、mem-loads),采样只有在未命中发生时才会被触发,PMU只会记录当前触发采样的未命中层级,不会额外回溯最终数据命中的层级。 - 硬件寄存器编码限制:x86处理器分配给数据来源字段的PMU寄存器位宽有限,优先编码触发采样的未命中事件,仅当所有片上缓存全部未命中时,才会补充编码最终的数据源(比如本地内存、远程NUMA节点)。
- perf默认解码逻辑优化:
perf script对data_src字段的默认解码策略是优先打印未命中信息,如果你需要查看完整的数据源编码,可以执行perf script -D导出原始样本的十六进制data_src值,对照内核头文件include/uapi/linux/perf_event.h中的PERF_MEM_S(xxx)系列宏定义手动解析,就能拿到完整的层级信息。
举个实际场景示例:
你看到的L1 miss样本,对应的通常是数据最终在L2缓存命中的场景,但因为采样是L1未命中触发,所以结果不会额外上报L2命中信息;L3 miss的样本则说明数据最终从内存或其他NUMA节点获取,你可以从原始编码中提取到对应的内存访问标识。
内核添加
PERF_SAMPLE_DATA_SRC的提交说明明确该字段的作用是「采集采样指令关联的数据的来源信息」,但字段的具体存储内容完全依赖底层硬件PMU的实现,不同架构的上报逻辑存在差异。
内容的提问来源于stack exchange,提问作者bryantcurto
相关产品推荐
相关产品推荐

