You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 16:01:34