文章目录
1. 引言
在安装perf工具时,可能会发现 apt-cache search linux-tools-$(uname -r)
无法找到与之内核版本 (6.8.4-060804-generic
) 相匹配的 linux-tools
。
$ apt-cache search linux-tools-$(uname -r)
$ sudo apt-get install linux-tools-$(uname -r)
E: Unable to locate package linux-tools-6.8.4-060804-generic
E: Couldn't find any package by glob 'linux-tools-6.8.4-060804-generic'
E: Couldn't find any package by regex 'linux-tools-6.8.4-060804-generic
本文将详细介绍如何编译 perf
工具,并解决编译过程中可能遇到的依赖问题。
关于Perf工具的使用请参考:
使用perf(火焰图)查看热点函数和系统调用最大延迟函数
如何使用perf 统计cpu和内存?
2. 安装开发工具和依赖
在开始编译 perf
工具之前,确保您的系统安装了必要的开发工具和库:
sudo apt update
sudo apt install git build-essential libncurses-dev flex bison openssl libssl-dev dkms libelf-dev libudev-dev libpci-dev libiberty-dev autoconf
3. 下载内核源代码
下载与当前内核版本匹配的内核源代码,确保能够正确编译 perf
工具:
wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.8.4.tar.xz
tar -xf linux-6.8.4.tar.xz
cd linux-6.8.4
4. 编译 perf
工具
进入内核源码的 tools/perf
目录,开始编译 perf
工具:
cd tools/perf
make
编译完成后,将生成的 perf
可执行文件复制到系统路径中:
sudo cp perf /usr/local/bin/
5. 验证 perf
工具的安装
成功编译后,验证 perf
是否已正确安装并可以使用:
$ perf --version
perf version 6.8.4
6. 解决编译中的依赖问题(选看)
在编译过程中,您可能会遇到多个依赖问题。以下是逐步解决这些问题的方法。
6.1 安装缺少的依赖项
首先,安装编译 perf
所需的各种开发库:
sudo apt update
sudo apt install libdw-dev libunwind-dev libslang2-dev liblzma-dev libzstd-dev libcap-dev libnuma-dev libbabeltrace-dev libperl-dev libtraceevent-dev libpfm4-dev libsystemd-dev elfutils libelf-dev systemtap-sdt-dev
这些依赖项确保 perf
工具的全面功能支持,包括调试、压缩、NUMA、事件跟踪等。
6.2 手动编译 libtraceevent
库
如果某些依赖项无法安装,您可以选择禁用相应的功能。例如,禁用 libtraceevent
:
make -j10 NO_LIBTRACEEVENT=1
当然也可以手动编译 libtraceevent
库。
安装libtraceevent编译工具和依赖
首先,安装编译所需的工具和依赖:
sudo apt update
sudo apt install git build-essential autoconf automake libtool pkg-config
克隆 libtraceevent
源代码
从官方库克隆 libtraceevent
源代码:
git clone https://git.kernel.org/pub/scm/libs/libtrace/libtraceevent.git
cd libtraceevent
编译和安装 libtraceevent
编译并安装 libtraceevent
:
make
sudo make install
sudo ldconfig
7. 如何禁用不需要的功能?(选看)
在编译perf
工具时,您可以根据需求禁用某些功能,以减少编译过程中对不必要依赖项的需求。以下是一些常见的禁用选项:
make -j10 NO_LIBTRACEEVENT=1 NO_LIBUNWIND=1 NO_LIBSLANG=1 NO_LIBBABELTRACE=1 NO_LIBPYTHON=1
NO_LIBTRACEEVENT=1
: 禁用libtraceevent
支持。NO_LIBUNWIND=1
: 禁用libunwind
支持(用于堆栈跟踪)。NO_LIBSLANG=1
: 禁用libslang
支持(用于文本用户界面)。NO_LIBBABELTRACE=1
: 禁用libbabeltrace
支持(用于perf data
的CTF格式)。NO_LIBPYTHON=1
: 禁用Python脚本支持。