armv7嵌入式Linux下perf record -g无显式指定事件挂死问题求助
perf 未指定事件时的默认采样事件是CPU周期硬件事件(cycles),会尝试调用平台硬件性能监控单元(PMU)实现采样,嵌入式ARM平台常出现PMU支持不完整导致的内核态死循环问题,正好匹配你观察到的perf_event_open调用卡住、进程持续处于运行态无响应的现象。
1 快速验证根因
先跳过硬件事件,用纯软件事件测试perf是否正常:
perf record -g -e cpu-clock ./your_app
cpu-clock是内核提供的软件计时事件,完全不依赖硬件PMU。如果该命令可以正常运行、退出,即可确认根因为内核硬件PMU支持异常。
2 修复硬件PMU适配问题
如果需要使用硬件性能事件,按以下步骤检查内核配置:
- 确认内核编译选项已开启PMU支持:
- 32位ARM平台检查
CONFIG_ARM_PMU=y、CONFIG_HW_PERF_EVENTS=y - 64位ARM平台检查
CONFIG_ARM64_PMU=y、CONFIG_HW_PERF_EVENTS=y
- 32位ARM平台检查
- 检查设备树是否添加了PMU节点,大部分嵌入式BSP默认不会携带PMU节点,需要根据CPU型号手动添加,示例如下:
pmu { compatible = "arm,cortex-a53-pmu"; // 替换为实际CPU架构对应的PMU兼容字符串 interrupts = <GIC_SPI 7 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 8 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 9 IRQ_TYPE_LEVEL_HIGH>, <GIC_SPI 10 IRQ_TYPE_LEVEL_HIGH>; // 每个CPU核心对应一个PMU中断 interrupt-affinity = <&cpu0>, <&cpu1>, <&cpu2>, <&cpu3>; };
- 烧录新内核后执行
perf list,如果能看到Hardware event分类下的cycles、instructions等事件,说明PMU适配完成,默认perf record即可正常运行。
3 临时/永久规避方案
如果不需要硬件事件、希望快速使用perf功能:
- 单次运行时手动指定软件事件即可,除了
cpu-clock,还可以用task-clock、software-page-fault等软件事件 - 永久修改perf默认事件,在设备的
/root/.perfconfig(如果是root用户运行perf)中添加如下配置:
[record] event = cpu-clock
后续直接执行perf record -g [进程]会默认使用软件事件,不会触发PMU适配问题。
4 进一步定位内核死循环的方法
如果需要确认内核具体卡住的位置,可以在启动内核时添加panic_on_warn=1 nmi_watchdog=1参数,复现挂死问题后会触发内核panic并打印死循环的调用栈,方便进一步排查PMU驱动的具体问题。
内容的提问来源于stack exchange,提问作者Jan Hudec
相关产品推荐
相关产品推荐

