Linux ARM平台perf单独统计用户态/内核态指令、周期数失败如何解决
问题根因
这不是你的操作错误,该问题出在ARM平台Linux 5.4内核的硬件PMU(性能监控单元)适配层面,通用perf事件配置开齐不等于平台专属的PMU特权级过滤功能已启用。
排查&解决思路
- 补全ARM平台专属PMU内核配置
你当前列出的都是perf通用功能配置,缺少硬件PMU的核心配置项,需要在编译内核时开启:# 32位ARM平台选这个 CONFIG_ARM_PMU=y # 64位AArch64平台选这个 CONFIG_ARM64_PMU=y # 通用硬件perf事件依赖,必须开启 CONFIG_HW_PERF_EVENTS=y # AArch64平台可选,开启用户态PMU访问权限,提升用户态事件统计兼容性 CONFIG_ARM64_PMU_EL0_ACCESS=y - 排查硬件能力限制
部分低端ARM Cortex-A系列(如部分修订版的Cortex-A53、Cortex-A35)或定制化ARM IP的PMU本身不支持特权级独立计数,无法拆分用户态/内核态的硬件事件统计。你可以查阅对应芯片的官方技术参考手册(TRM)的PMU章节,确认是否支持该能力。 - 排除权限配置问题
先执行cat /proc/sys/kernel/perf_event_paranoid查看perf权限级别,如果返回值大于2,可先用root权限执行sysctl -w kernel.perf_event_paranoid=0后重试,排除权限限制导致的不支持报错。 - 升级内核版本
Linux 5.4对很多新ARM芯片的PMU适配不全,大量PMU特权级过滤的补丁是在5.10及以上LTS版本合入的,条件允许的话可以升级内核版本验证。
临时替代方案
如果硬件确实不支持或暂时无法调整内核配置,可以用采样方式间接统计:用perf record采样全量cycles/instructions事件后,按地址空间过滤用户态/内核态的样本,换算出对应态的计数占比,精度略低于硬件直接计数,但可以满足大部分分析需求。
内容的提问来源于stack exchange,提问作者RVR
相关产品推荐
相关产品推荐

