如何通过perf工具采集DMA内存读写事件?是否有对应事件或设置方法?
解答:用perf捕获DMA发起的内存操作事件
为什么perf默认不统计DMA内存操作
perf自带的cpu/mem-loads/p、cpu/mem-stores/p这类预定义事件,是为追踪CPU核心发起的内存读写设计的,默认未开启ESCR寄存器的掩码位14,因此不会统计DMA这类非CPU发起的内存访问——常规性能分析大多聚焦CPU自身的内存行为,DMA属于I/O子系统操作,不在默认覆盖范围内。
有没有现成的perf预定义事件?
没有,目前perf的标准事件列表里没有专门针对DMA内存操作的预定义项,需要手动配置PMU事件来开启掩码位14。
两种捕获DMA内存事件的方法
1. 用perf命令行直接指定原始事件
在Intel Xeon平台上,可通过perf的原始事件语法,将ESCR掩码位14(从0开始计数)置1,结合内存操作的基础事件编码构造事件。比如捕获包含DMA的内存加载操作:
perf record -e r100000000000000e:p -P $PID
提示:具体基础事件编码需参考你提到的Intel Xeon手册第475页,不同代Xeon的编码可能有差异,手册会明确对应内存加载/存储的事件编码和掩码规则。
2. 调用perf_event_open()系统自定义事件
若要在程序中集成监控,直接使用内核的perf_event_open()系统调用更灵活:
- 初始化
perf_event_attr结构体,将type设为PERF_TYPE_RAW(对应原始PMU事件)。 - 在
config字段填入包含掩码位14的事件编码。 - 调用
perf_event_open()打开事件,后续通过读返回的文件描述符获取计数。
注意事项
- 必须以root权限执行,因为访问CPU PMU寄存器属于特权操作。
- 不同代Xeon的PMU事件编码可能不同,务必对照对应型号的官方手册配置。
- DMA操作可能包含大量I/O后台操作,记得用
-P $PID过滤目标进程,避免数据冗余杂乱。
内容的提问来源于stack exchange,提问作者Yang2157
相关产品推荐
相关产品推荐

