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 在硬件事件采样、调用链还原、多进程聚合分析方面具有不可替代的优势。
1.1.1 Perf 在 Android/Linux 性能分析中的地位
下图展示了 Perf 在 Android 性能分析工具栈中的位置:
从上图可以看出,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 延迟 | 驱动函数调用、中断上下文 |
1.1.3 三者的协作关系
下面的 SVG 图展示了 Perf、Ftrace 和 Systrace 在 Android 驱动调优流程中的协作关系:
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 架构的硬件采样分析 |
CONFIG_PERF_EVENTS。在开始调优前,务必确认目标设备的内核配置:zcat /proc/config.gz | grep PERF_EVENTS。
1.1.5 本章小结
Perf 作为 Linux 内核官方性能分析工具,在 Android 驱动调优中扮演着“第一道探针”的角色。它与 Systrace 和 Ftrace 形成互补:Perf 负责全局热点发现,Ftrace 负责局部函数跟踪,Systrace 负责用户态交互验证。掌握三者的协作关系,是成为一名合格的 Android 底层驱动调优专家的第一步。