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

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
  • 检查设备树是否添加了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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.30 00:39:02