ARM Streamline访问PMU寄存器返回零值问题咨询
根因说明
问题由两类原因共同导致:
- PMU硬件资源冲突:从lsof输出可见PID 7545的system_server所属Binder线程已持有perf_event句柄。ARM v8架构单CPU核心的通用PMU硬件计数器仅6-7个,被其他进程占用后gator无法申请到足够的硬件事件组,直接导致部分计数器返回值为0。
- 内核配置/设备树适配异常:Streamline返回的
No Perf PMUs detected警告,说明当前内核可能未开启perf硬件事件支持,或设备树未正确注册Kryo 680的PMU节点。
排查解决步骤
内核配置校验
拉取当前设备内核配置,检查关键配置项状态:adb shell zcat /proc/config.gz | grep -E "CONFIG_HW_PERF_EVENTS|CONFIG_ARM_PMU|CONFIG_PERF_EVENTS"正常状态下三个配置项值均为
y。若未开启,需重新编译内核打开对应选项后刷入设备,同时确认设备树中包含对应核心的PMU注册节点(Kryo 680基于Arm Cortex-X1/A78/A55公版架构,兼容公版PMU驱动)。释放被占用的PMU资源
- 停止系统默认采集服务:
adb shell setprop persist.traced.enable 0 adb shell stop perfetto adb shell pkill -f perf - 终止占用perf_event的进程:
注意:PID 7545为system_server进程,终止后系统会自动重启该进程,重启后默认不会自动拉起perf采集逻辑。操作后重新执行adb shell kill -9 7545lsof|grep perf_event,确认无其他进程持有perf_event句柄。 - 关闭干扰内核机制:
固定CPU频率调度策略为性能模式,避免核心动态调频、热插拔导致计数器读取异常。adb shell echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
- 停止系统默认采集服务:
替换适配Android 11的gator版本
Streamline 8.0自带的预编译gator未完全适配Android 11的perf_event接口权限,需从源码编译适配版本:- 编译时开启Android 11适配编译选项
- 将编译生成的gator-daemon推送到设备
/data/local/tmp目录,授予可执行权限 - 启动gator前执行
setenforce 0临时关闭SELinux,避免权限拦截导致PMU读取失败。
Atrace告警修复
Unable to locate notify.dex告警不影响PMU计数器采集。若需同时采集atrace数据,将对应版本的notify.dex推送至设备/system/framework/目录,重启设备即可识别。
效果验证
完成上述操作后,先执行以下命令确认硬件PMU事件可正常枚举:
adb shell simpleperf list hw
若命令输出完整的硬件PMU事件列表,且gator运行日志中无perf资源冲突提示,重新启动Streamline采集即可获取正常的非零PMU计数数据。
内容的提问来源于stack exchange,提问作者vic
相关产品推荐
相关产品推荐

