4. Perf 工具入门:安装与基本用法
Perf 是 Linux 内核提供的性能剖析工具集,基于内核的 Performance Events 子系统,能够以极低开销采集 CPU 周期、缓存命中、分支预测、硬件中断等事件。在摄像头驱动开发中,Perf 可用于定位中断延迟、DMA 拷贝瓶颈、帧处理函数热点等关键问题。
适用场景:Perf 适合分析用户态与内核态混合的驱动代码,无需重新编译内核或驱动,即可对运行中的摄像头 pipeline 进行采样。
4.1 Perf 的安装
不同嵌入式 Linux 发行版的安装方式略有差异,下表列出常见平台的安装命令:
| 平台 / 发行版 | 安装命令 | 备注 |
|---|---|---|
| Ubuntu / Debian | sudo apt install linux-tools-common linux-tools-$(uname -r) |
需匹配当前内核版本 |
| Yocto / Poky | bitbake perf 或添加 perf 到 IMAGE_INSTALL |
需在构建时包含 perf 包 |
| Buildroot | 在 make menuconfig 中选中 Perf |
位于 Target packages → Development tools |
| OpenWrt | opkg install perf |
部分架构需自编译 |
内核配置检查:确保内核开启了
CONFIG_PERF_EVENTS=y 以及 CONFIG_HW_PERF_EVENTS=y。若目标板为 ARM,还需确认 PMU 中断正确路由。
4.2 Perf 基本用法概览
Perf 提供多个子命令,覆盖从全局监控到细粒度采样的需求。下表列出最常用的三个子命令及其核心用途:
| 子命令 | 功能 | 典型输出 |
|---|---|---|
perf stat |
统计指定程序的硬件/软件事件计数 | 周期数、指令数、缓存未命中、上下文切换 |
perf record + perf report |
采样并生成调用链热点报告 | 函数级 CPU 占比、调用路径 |
perf top |
实时显示当前系统热点函数 | 动态更新的函数排名与开销 |
4.3 perf stat:事件计数统计
perf stat 用于运行一个命令并收集其执行期间的硬件/软件事件总数。在摄像头驱动场景中,常用来对比不同帧率或分辨率下的关键指标。
基本语法:
perf stat [-e event1,event2,...] <command>
实战示例:统计摄像头采集进程
# 统计采集 100 帧期间的事件
perf stat -e cycles,instructions,cache-misses,branch-misses \
./capture_test --frames 100
输出解读:
Performance counter stats for './capture_test --frames 100':
1,234,567,890 cycles # 2.4 GHz
987,654,321 instructions # 0.80 insn per cycle
12,345 cache-misses # 3.2% of all cache refs
5,678 branch-misses # 1.1% of all branches
0.512345678 seconds time elapsed
驱动优化指标:
• instructions per cycle (IPC):低于 0.5 可能暗示内存瓶颈或长延迟指令。
• cache-misses 比例:高于 5% 时需关注 DMA 缓冲区对齐或数据局部性。
• context-switches:频繁切换可能因中断处理过长或线程优先级不当。
• instructions per cycle (IPC):低于 0.5 可能暗示内存瓶颈或长延迟指令。
• cache-misses 比例:高于 5% 时需关注 DMA 缓冲区对齐或数据局部性。
• context-switches:频繁切换可能因中断处理过长或线程优先级不当。
4.4 perf record / perf report:采样与热点分析
perf record 以指定频率对 CPU 进行采样,记录每个采样点的程序计数器(PC)和调用栈;perf report 将采样数据解析为函数级开销报告。
基本用法:
# 以 99 Hz 采样,记录调用链,持续 10 秒
perf record -F 99 -g -- sleep 10
# 生成报告
perf report
摄像头驱动采样示例:
# 采集摄像头中断处理函数的热点
perf record -e cycles:pp -g -p $(pgrep capture_daemon) -- sleep 5
perf report --stdio
报告片段:
# Overhead Command Shared Object Symbol
# ........ ........... ................... .....................
35.2% capture_daemon [kernel.kallsyms] [k] cci_isr
18.7% capture_daemon [kernel.kallsyms] [k] vb2_buffer_done
12.3% capture_daemon libc-2.31.so [.] memcpy
8.1% capture_daemon [kernel.kallsyms] [k] dma_buf_attach
调用链展开:在
perf report 界面按 Enter 展开函数调用链,可逐层查看 cci_isr 是被哪个驱动函数调用的,从而定位中断处理中的耗时子路径。
4.5 perf top:实时热点监控
perf top 类似于 top 命令,但显示的是 CPU 周期占比最高的函数,而非进程。适合在摄像头运行过程中动态观察热点变化。
基本语法:
perf top [-e event] [-p pid] [-K] [-U]
常用选项:
| 选项 | 含义 | 驱动调试场景 |
|---|---|---|
-K |
只显示内核态函数 | 聚焦中断处理、DMA 回调 |
-U |
只显示用户态函数 | 分析应用层帧处理、编解码 |
-p <pid> |
监控指定进程 | 单独跟踪摄像头守护进程 |
-e cache-misses |
按缓存未命中排序 | 检测 DMA 缓冲区对齐问题 |
实战命令:
# 实时查看摄像头进程的内核热点
perf top -K -p $(pgrep capture_daemon)
输出示例:
PerfTop: 1234 irqs/sec kernel:100% exact: 0.0% [1000Hz cycles]
45.2% [kernel] [k] cci_isr
22.1% [kernel] [k] vb2_buffer_done
10.3% [kernel] [k] _raw_spin_lock
7.8% [kernel] [k] dma_sync_single_for_cpu
5.4% [kernel] [k] __arm_copy_from_user
采样频率注意:嵌入式平台 CPU 资源有限,
-F 99(99 Hz)通常足够;过高的采样频率(如 1000 Hz)可能引入额外开销,影响驱动实时行为。
4.6 本章小结
- 安装:根据发行版选择对应包管理器,确保内核配置开启 PERF_EVENTS。
- perf stat:适合宏观对比,快速获取 IPC、缓存命中率等关键指标。
- perf record/report:用于深度热点定位,结合调用链可精确到驱动函数。
- perf top:实时监控工具,适合在摄像头运行中动态观察热点变化。