从源码构建 Jetson-Perf:一步步指南
在 NVIDIA Jetson 平台上进行性能分析时,perf 工具是不可或缺的利器。然而,由于硬件架构和内核版本的特殊性,直接使用预编译版本可能无法完全满足需求。本文将从源码开始,详细介绍如何在 Jetson Orin 和 X86 平台上构建 perf 工具,并解决编译过程中可能遇到的常见问题。
一、准备工作:源码下载
Jetson Orin 平台
- 下载 L4T 驱动包
访问 NVIDIA 开发者下载中心,搜索 Jetson Linux Driver Package (L4T),选择与设备匹配的版本(如 R35.x 系列)。
[注:需根据 Jetson 型号选择对应的版本,参考下图中的版本号。] - 获取 BSP 源码
下载完成后,找到public_sources.tbz2
文件,这是构建内核和工具链所需的基础源码包。
Orin Drive 平台
查看当前系统的核版本
1
uname -r
下载内核源码
访问 Linux 内核镜像站,根据当前系统内核版本下载对应的源码包。
例如:若内核版本为5.15.116-rt-tegra
,则下载linux-5.15.116.tar.gz
。
X86 平台
查看当前系统的核版本
1
uname -r
下载内核源码
访问 Linux 内核镜像站,根据当前系统内核版本下载对应的源码包。
例如:若内核版本为5.10.0
,则下载linux-5.10.tar.gz
。
二、源码编译步骤
编译环境准备
1 | sudo apt install make gcc flex bison pkg-config -y |
Jetson Orin 编译流程
1 | tar -xjvf public_sources.tbz2 && \ |
Orin Drive 编译流程
1 | tar zxvf linux-5.15.116.tar.gz && \ |
X86 平台编译流程
安装依赖项
X86 平台需安装以下开发库:1
2
3
4sudo 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编译 perf
1
2
3
4
5
6
7tar 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 | git clone https://github.com/brendangregg/FlameGraph.git |
将此工具的路径加入环境变量,或直接通过绝对路径调用脚本(如 ./FlameGraph/stackcollapse-perf.pl
)。
2. 使用 perf
采集性能数据
运行目标程序,并通过 perf record
记录性能事件(如 CPU 周期、缓存失效等):
1 | # 监控 CPU 使用情况(默认) |
- 参数说明:
-F 99
:采样频率为 99 Hz(避免与某些内核频率冲突)。-a
:监控所有 CPU。-g
:记录调用栈(生成火焰图必需)。-- sleep 60
:持续采样 60 秒。
3. 生成火焰图
采集完成后,按以下步骤处理数据:
1 | # 生成 perf.data 的解析文本 |
4. 查看与分析火焰图
用浏览器打开 flamegraph.svg
,可以看到类似下图的交互式可视化结果:
火焰图解读技巧:
- 横向宽度:表示函数或代码路径的资源(如 CPU 时间)占用比例。
- 纵向层级:表示函数调用栈的深度,顶层是正在执行的函数,下层是调用者。
- 点击缩放:支持点击任意区块展开查看细节。
- 高亮搜索:按
Ctrl + F
搜索关键函数名。
五、常见问题解决(FAQ)
Q1:编译时提示某些 Feature 未启用
问题现象
编译过程中出现 WARNING: ... missing xxx,某些功能将被禁用
。
解决方法
查看具体错误日志:
1
cat ../build/feature/test-libunwind.make.output
根据缺失的依赖安装对应开发库。
安装elf
即可sudo apt install -y libelf-dev
,其余Feature开启方法同理1
2
3
4
5
6sudo 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 stat
或 perf record
分析程序性能。
从源码构建 Jetson-Perf:一步步指南