Arm64 Cortex-A72平台perf top仅核心0可用问题排查求助
问题:Arm64设备Perf Top仅核心0可用的排查与修复
我使用搭载4核Cortex-A72的Arm64设备,运行4.19.139版本内核,发现perf top仅能在核心0正常工作,具体现象如下:
perf top -C 0可正常运行perf top -C 1仅显示表头无数据输出(核心1上有程序运行且无报错),示例输出:
PerfTop: 0 irqs/sec kernel: 0.0% exact: 0.0% [1000Hz cycles:ppp], (all, CPU: 1) -------------------------------------------------------------------------------
- 直接执行
perf top仅显示核心0的结果 perf top -t [绑定核心1的线程tid]无结果输出perf top -t [绑定核心0的线程tid]可正常运行
已尝试的操作:
- 查看kmesg确认armv8_cortex_a72 PMU驱动已加载,输出:
hw perfevents: enabled with armv8_cortex_a72 PMU driver, 7 counters available perf stat可正确识别设备4核CPUperf --version显示版本与内核一致,为4.19.139
排查与修复建议
1. 检查核心1的PMU计数器状态
执行以下命令查看每个核心的PMU可用性:
for cpu in 0 1 2 3; do echo "CPU $cpu:" cat /sys/devices/platform/arm-pmu/cpu$cpu/online cat /sys/devices/platform/arm-pmu/cpu$cpu/pmu/available_counters done
如果核心1的online值为0,说明核心被离线,执行以下命令启用:
echo 1 > /sys/devices/platform/arm-pmu/cpu1/online
2. 验证核心1的PMU中断配置
Perf依赖PMU中断完成采样,检查核心1的中断是否正常注册:
cat /proc/interrupts | grep arm-pmu
确认每个核心对应arm-pmu中断条目,且核心1的中断计数有增长(若核心有负载)。若中断计数为0,尝试重新绑定中断:
# 先获取arm-pmu的中断号,假设为32 echo 1 > /proc/irq/32/smp_affinity_list
3. 核对内核PMU相关编译配置
查看内核配置文件(/boot/config-4.19.139或/proc/config.gz),确认以下选项已开启:
CONFIG_PERF_EVENTS=y CONFIG_HW_PERF_EVENTS=y CONFIG_ARM_PMU=y CONFIG_ARM64_PMU=y CONFIG_CPU_PM_CPU_IDLE=y # 若核心支持休眠,需确保唤醒后PMU正常工作
若缺少配置,需重新编译内核并启用对应选项。
4. 测试内核补丁或工具版本
4.19.139内核可能存在Arm64多核心PMU的特定bug,可尝试:
- 升级Perf工具到对应内核分支的最新稳定补丁版本
- 查找内核社区是否有针对Cortex-A72多核心PMU采样的修复补丁,手动应用后重新编译内核
5. 确认核心1的真实负载
确保绑定到核心1的线程确实在产生负载,用taskset -c 1 dd if=/dev/zero of=/dev/null手动启动高负载程序,再执行perf top -C 1测试是否有数据输出。
内容的提问来源于stack exchange,提问作者bgli100
相关产品推荐
相关产品推荐

