AMD Zen2 CPU下如何用perf正确测量LLC/L3缓存未命中率
问题根因
你当前使用的5.4.0-66-generic内核未合入AMD Zen2架构的独立L3 PMU驱动,且L3缓存事件不属于CPU核心PMU的计数范围:
- 直接使用核心PMU的raw事件格式
r0106、rFF04计数返回0,是因为核心PMU无法访问L3专属的计数寄存器,硬件不会触发对应计数。 - 使用
amd_l3/r8001/格式报"unknown terms"错误,是因为事件参数格式不符合L3 PMU驱动的解析规则,直接把事件号和umask的合并值传入时驱动无法识别。 - 预设事件名返回
<not supported>,本质是系统找不到amd_l3对应的PMU设备,事件映射关系无法生效。
前置环境修复
首先要让系统正确识别amd_l3 PMU设备,二选一即可:
- 升级内核到5.11及以上的主线版本,该版本开始正式合入AMD Zen2/Zen3架构的L3 PMU驱动,升级完成后重启,执行
ls /sys/devices/ | grep amd_l3能看到输出即代表驱动加载正常。 - 如果必须使用5.4版本内核,需要自行给内核打AMD L3 PMU的backport补丁,重新编译安装内核后验证驱动加载状态。
perf命令行正确用法
驱动加载正常后,不要用核心raw事件格式测L3事件,正确的命令格式如下:
numactl -C 0 -m 0 perf stat -e instructions,cycles,amd_l3/event=0x04,umask=0xFF/,amd_l3/event=0x06,umask=0x01/ ./benchmark
其中amd_l3/event=0x04,umask=0xFF/对应L3访问事件,amd_l3/event=0x06,umask=0x01/对应L3未命中事件。
perf C API配置步骤
配置perf_event_attr结构体时不要使用PERF_TYPE_RAW类型,按以下流程配置:
- 动态读取amd_l3 PMU的类型号:解析
/sys/devices/amd_l3/type文件的整数值,该值为系统启动时动态分配,不可硬编码。 - 将
perf_event_attr.type字段设置为上一步读取到的类型值。 - 配置
perf_event_attr.config字段:按照AMD PMU的寄存器格式拼接参数,事件号放在低8位,umask值放在第8到15位:- L3访问事件:事件号0x04、umask0xFF,对应config值为
0xFF04 - L3未命中事件:事件号0x06、umask0x01,对应config值为
0x0106
- L3访问事件:事件号0x04、umask0xFF,对应config值为
- 其余配置项(如exclude_user、exclude_kernel、pinned等)按实际测量需求设置,和核心PMU事件的配置逻辑一致。
注意:AMD Zen2架构的L3缓存以CCD为单位独立划分,每个amd_l3 PMU实例仅对应一个CCD的L3缓存,测量时需要把测试进程绑定到同一CCD下的核心,否则会出现计数遗漏、结果不准的问题。
内容的提问来源于stack exchange,提问作者Maxbit
相关产品推荐
相关产品推荐

