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 实时显示当前系统热点函数 动态更新的函数排名与开销
Perf 子命令工作流关系图 Perf 子命令工作流 perf stat 事件计数统计 perf record 采样 + 调用链 perf top 实时热点监控 输出示例 cycles, instructions cache-misses, context-switches 输出示例 函数名 + 采样占比 调用链火焰图数据 输出示例 实时刷新函数排名 按 CPU 占用排序

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:频繁切换可能因中断处理过长或线程优先级不当。

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:实时监控工具,适合在摄像头运行中动态观察热点变化。