1.1 Perf 工具概述:起源、地位与生态关系

Perf 是 Linux 内核社区官方维护的性能剖析(Profiling)工具集,最初由 Thomas Gleixner 和 Ingo Molnar 等人于 2009 年合入内核主线(Linux 2.6.31)。它基于内核的 perf_event 子系统,利用硬件 PMU(Performance Monitoring Unit)和内核软件事件,以极低开销采集 CPU 周期、缓存命中率、分支预测、上下文切换、软中断等关键指标。

在 Android 与嵌入式 Linux 领域,Perf 是驱动开发者定位中断延迟过高、DMA 拷贝瓶颈、调度抖动、锁竞争等底层问题的首选工具。与 Systrace 和 Ftrace 相比,Perf 在硬件事件采样、调用链还原、多进程聚合分析方面具有不可替代的优势。

核心观点:Perf 是连接硬件 PMU 与内核软件事件的桥梁,是 Android 驱动调优中“从数据到根因”的关键一环。

1.1.1 Perf 在 Android/Linux 性能分析中的地位

下图展示了 Perf 在 Android 性能分析工具栈中的位置:

Perf 在 Android 性能分析工具栈中的定位 应用层(App / Framework) 系统服务层(SurfaceFlinger / AudioFlinger / HAL) Linux 内核(调度器 / 中断 / 驱动 / 内存管理) 硬件层(CPU PMU / GPU / DDR / 外设) Perf 采样点 Perf 可跨层采样,不限于内核

从上图可以看出,Perf 的采样点覆盖从硬件 PMU 到内核再到用户态的全路径。在驱动调优场景中,Perf 能够直接回答以下问题:

  • 中断处理函数占用了多少 CPU 周期?
  • DMA 拷贝是否因 cache miss 而变慢?
  • 自旋锁的等待时间是否导致调度延迟?
  • 工作队列的执行是否被高优先级中断抢占?

1.1.2 Perf 与 Systrace / Ftrace 的关系

很多初学者容易混淆 Perf、Systrace 和 Ftrace 三者的定位。下表从多个维度进行对比:

对比维度 Perf Systrace Ftrace
数据来源 硬件 PMU + 内核软件事件 内核 Tracepoint + atrace 内核静态/动态 Tracepoint
采样方式 周期采样 / 计数 / 跟踪 连续跟踪(时间戳标记) 连续跟踪(函数调用栈)
开销 极低(硬件采样) 中等(字符串格式化) 较高(函数级插桩)
典型输出 perf.data / 火焰图 / 报告 HTML 时间轴 / 饼图 trace.txt / trace.dat
驱动调优优势 硬件事件分析、调用链还原 Android 专用、UI 交互流畅 内核函数级跟踪、动态插桩
适用场景 CPU 热点、缓存、分支预测 App 启动、渲染、Binder 延迟 驱动函数调用、中断上下文
实践建议:在 Android 驱动调优中,通常先用 Perf 做全局热点扫描,再用 Ftrace 做局部函数跟踪,最后用 Systrace 验证用户态交互影响。三者互补而非替代。

1.1.3 三者的协作关系

下面的 SVG 图展示了 Perf、Ftrace 和 Systrace 在 Android 驱动调优流程中的协作关系:

Perf / Ftrace / Systrace 协作流程 步骤 1:Perf 全局扫描 perf top / perf record -a 定位热点函数与硬件事件 步骤 2:Ftrace 局部跟踪 echo function_graph > current_tracer 分析驱动函数调用链与延迟 步骤 3:Systrace 验证 python systrace.py 确认用户态交互影响 典型驱动调优循环 Perf 发现热点 → Ftrace 定位根因 → 修改驱动代码 → Systrace 验证效果 → 回归 Perf 确认改善 迭代调优

1.1.4 Perf 的起源与演进

Perf 的诞生源于 Linux 内核社区对统一性能分析接口的需求。在 Perf 出现之前,开发者需要依赖 oprofile、gprof、valgrind 等第三方工具,它们要么需要内核补丁,要么开销过高,要么无法在 Android 嵌入式环境中运行。

Perf 的关键演进节点:

内核版本 新增特性 对驱动调优的意义
2.6.31 (2009) perf_event 子系统、perf top/stat 首次提供统一的硬件 PMU 访问接口
2.6.35 (2010) perf record/report、调用链采样 支持驱动中断处理函数的调用链分析
3.1 (2011) perf probe 动态插桩 无需重新编译内核即可跟踪驱动函数
3.10 (2013) perf c2c 缓存一致性分析 定位 DMA 缓存伪共享问题
4.4 (2016) perf sched 调度分析 分析驱动工作队列的调度延迟
5.10 (2020) perf stat --per-thread、ARM SPE 支持 ARM 架构的硬件采样分析
注意:Android 内核通常基于上游 LTS 版本,但部分厂商会裁剪或禁用 CONFIG_PERF_EVENTS。在开始调优前,务必确认目标设备的内核配置:zcat /proc/config.gz | grep PERF_EVENTS。

1.1.5 本章小结

Perf 作为 Linux 内核官方性能分析工具,在 Android 驱动调优中扮演着“第一道探针”的角色。它与 Systrace 和 Ftrace 形成互补:Perf 负责全局热点发现,Ftrace 负责局部函数跟踪,Systrace 负责用户态交互验证。掌握三者的协作关系,是成为一名合格的 Android 底层驱动调优专家的第一步。