从源码构建 Jetson-Perf:一步步指南

在 NVIDIA Jetson 平台上进行性能分析时,perf 工具是不可或缺的利器。然而,由于硬件架构和内核版本的特殊性,直接使用预编译版本可能无法完全满足需求。本文将从源码开始,详细介绍如何在 Jetson Orin 和 X86 平台上构建 perf 工具,并解决编译过程中可能遇到的常见问题。


一、准备工作:源码下载

Jetson Orin 平台

  1. 下载 L4T 驱动包
    访问 NVIDIA 开发者下载中心,搜索 Jetson Linux Driver Package (L4T),选择与设备匹配的版本(如 R35.x 系列)。
    [注:需根据 Jetson 型号选择对应的版本,参考下图中的版本号。]
  2. 获取 BSP 源码
    下载完成后,找到 public_sources.tbz2 文件,这是构建内核和工具链所需的基础源码包。

Orin Drive 平台

  1. 查看当前系统的核版本

    1
    uname -r
  2. 下载内核源码
    访问 Linux 内核镜像站,根据当前系统内核版本下载对应的源码包。
    例如:若内核版本为 5.15.116-rt-tegra,则下载 linux-5.15.116.tar.gz


X86 平台

  1. 查看当前系统的核版本

    1
    uname -r
  2. 下载内核源码
    访问 Linux 内核镜像站,根据当前系统内核版本下载对应的源码包。
    例如:若内核版本为 5.10.0,则下载 linux-5.10.tar.gz


二、源码编译步骤

编译环境准备

1
sudo apt install make gcc flex bison pkg-config -y

Jetson Orin 编译流程

1
2
3
4
5
6
7
8
9
10
tar -xjvf public_sources.tbz2 && \
cd Linux_for_Tegra/source/public && \

tar -xjvf kernel_src.tbz2 && \
cd kernel/kernel-5.10/tools/perf && \

make -j$(nproc) && \
sudo make install && \

./perf --version

Orin Drive 编译流程

1
2
3
4
5
6
7
8
tar zxvf linux-5.15.116.tar.gz && \
cd linux-5.15.116/tools/perf && \

make -j$(nproc) && \
sudo make install && \

./perf --version


X86 平台编译流程

  1. 安装依赖项
    X86 平台需安装以下开发库:

    1
    2
    3
    4
    sudo apt-get install build-essential flex bison python3 python3-dev \
    libelf-dev libnewt-dev libdw-dev libaudit-dev libiberty-dev \
    libunwind-dev libcap-dev libzstd-dev libnuma-dev libssl-dev \
    binutils-dev gcc-multilib liblzma-dev
  2. 编译 perf

    1
    2
    3
    4
    5
    6
    7
    tar zxvf linux-5.10.tar.gz && \
    cd linux-5.10/tools/perf && \

    make -j$(nproc) && \
    sudo make install && \

    ./perf --version

三、开启内核调试支持

默认情况下,Linux 内核会限制 perf 的权限。通过以下命令解除限制:

1
sudo sysctl kernel.perf_event_paranoid=-1

将此设置永久生效,可将其写入 /etc/sysctl.conf


四、通过 perf 生成火焰图:直观分析性能瓶颈

火焰图(Flame Graph)是性能分析的利器,它能以可视化方式展示程序的函数调用栈和资源占用情况。结合 perf 工具,我们可以快速生成火焰图,精准定位性能瓶颈。以下是详细操作步骤:

1. 安装火焰图生成工具

首先需要克隆 Brendan Gregg 的 FlameGraph 工具库:

1
2
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph

将此工具的路径加入环境变量,或直接通过绝对路径调用脚本(如 ./FlameGraph/stackcollapse-perf.pl)。

2. 使用 perf 采集性能数据

运行目标程序,并通过 perf record 记录性能事件(如 CPU 周期、缓存失效等):

1
2
3
4
5
6
# 监控 CPU 使用情况(默认)
sudo perf record -F 99 -a -g -- sleep 60
# 或监控特定进程
sudo perf record -F 99 -p <PID> -g -- sleep 30
# 或监控具体程序
sudo perf record -F 99 -g ./<MY_PROGRAM>
  • 参数说明
    • -F 99:采样频率为 99 Hz(避免与某些内核频率冲突)。
    • -a:监控所有 CPU。
    • -g:记录调用栈(生成火焰图必需)。
    • -- sleep 60:持续采样 60 秒。

3. 生成火焰图

采集完成后,按以下步骤处理数据:

1
2
3
4
5
6
7
8
# 生成 perf.data 的解析文本
sudo perf script > out.perf

# 折叠调用栈(关键步骤)
./FlameGraph/stackcollapse-perf.pl out.perf > out.folded

# 生成 SVG 格式火焰图
./FlameGraph/flamegraph.pl out.folded > flamegraph.svg

4. 查看与分析火焰图

用浏览器打开 flamegraph.svg,可以看到类似下图的交互式可视化结果:

火焰图解读技巧

  • 横向宽度:表示函数或代码路径的资源(如 CPU 时间)占用比例。
  • 纵向层级:表示函数调用栈的深度,顶层是正在执行的函数,下层是调用者。
  • 点击缩放:支持点击任意区块展开查看细节。
  • 高亮搜索:按 Ctrl + F 搜索关键函数名。

五、常见问题解决(FAQ)

Q1:编译时提示某些 Feature 未启用

问题现象
编译过程中出现 WARNING: ... missing xxx,某些功能将被禁用

解决方法

  1. 查看具体错误日志:

    1
    cat ../build/feature/test-libunwind.make.output

  2. 根据缺失的依赖安装对应开发库。
    安装elf即可sudo apt install -y libelf-dev,其余Feature开启方法同理

    1
    2
    3
    4
    5
    6
    sudo apt install -y libelf-dev
    sudo apt install libunwind-dev
    sudo apt install -y libdw1
    sudo apt install -y elfutils
    sudo apt install -y libdw-dev
    sudo apt install -y binutils-dev

Q2:运行 perf 时权限不足

若未设置 kernel.perf_event_paranoid,需通过 sudo 运行 perf,或按第三步永久解除限制。


六、总结

通过从源码构建 perf 工具,可以确保其与当前内核版本的完全兼容性,并启用所有高级功能。如果在编译中遇到问题,请优先检查依赖项和错误日志,大多数问题均可通过安装缺失的库解决。


效果验证
成功编译后,运行 perf list 可查看支持的性能监控事件。尝试使用 perf statperf record 分析程序性能。

Author

SilvesterHsu

Posted on

2025-02-17

Updated on

2025-05-16

Licensed under

Comments