安装
uname -r
由于我之前升级了内核版本(6.2.1),故直接以下命令并不能成功安装perf工具(使用perf命令无法成功)
sudo apt-get install linux-tools-common
perf --version
# 找到自己内核版本的内核源码路径 (也可以网上直接下载)
# [Index of /pub/linux/kernel/](https://mirrors.edge.kernel.org/pub/linux/kernel/)
cd path/linux-6.2.1/tools/perf # 将path替换为自己的路径
make -j4 && make install # 安装perf
cp ./perf /usr/bin
perf --version
使用
# 用gcc编译好对应的可执行文件
gcc -g image_to_gerber.c -o image_to_gerber
# perf启动 生成perf.data
sudo perf record -a -g ./image_to_gerber
# 授权 (不然后面查看svg会显示No stack counts found! 后面的命令一定要加sudo)
sudo chmod -R 777 perf.data
# 下载火焰图生成项目
git clone https://github.com/brendangregg/FlameGraph.git
# 生成out.perf
sudo perf script -i perf.data > out.perf
#生成out.floded
sudo ./FlameGraph/stackcollapse-perf.pl out.perf > out.floded
#生成svg
sudo ./FlameGraph/flamegraph.pl out.floded > ls.svg
结果
分析
火焰图中出现了很多swapper,一开始以为是缺页导致的,后面查询后发现是这是cpu空闲状态的表示
off-cpu
在前面我们已经计算了cpu的占用时间,以下部分用于统计cpu的空闲时间
注意,在linux6.2.1版本中使用perf sched提示没有该命令,而切换内核版本为5.10.150就能使用,故以下内容均在5.10版本中使用 (6.2.1版本正在试验bpfcc)
perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -p tikv_pid -g -o perf.data.raw ./my_program
# 拼接各部分数据生成perf.data
perf inject -v -s -i perf.data.raw -o perf.data
... # 之后的操作与on cpu操作相同
使用bcc工具进行分析
主要参考网站:
https://www.tianxiaohui.com/index.php/Linux%E7%9B%B8%E5%85%B3/ubuntu-20-04-4-%E5%AE%89%E8%A3%85-eBPF-bcc.html
https://github.com/iovisor/bcc
1.安装bcc
一开始按部就班地进行git clone
git clone https://github.com/iovisor/bcc.git
mkdir bcc/build; cd bcc/build
cmake .. ## 会卡在这一步
make
sudo make install
cmake -DPYTHON_CMD=python3 .. # build python3 binding
pushd src/python/
make
sudo make install
popd
1.2. 设置git代理,clash安装解决cmake .. 克隆卡住问题
zhuanlan.zhihu.com/p/481574024
1.3. sudo make install 报错
解决方法: 切换至管理员root
su
vim ~/.bashrc
export PYTHONPATH=/lib/python3/dist-packages:$PYTHONPATH
source ~/.bashrc # 配置生效
echo $PYTHONPATH # 打印是否正确配置
make install
2. 版本适配问题,python问题
2.1 确保系统版本python为python3而不是python2
python --version # 如果这里是2的话要安装python3
## 也可以cd到/usr/bin目录 查看是否有python3
cd /usr/bin
ls -l | grep python
sudo rm -rf python # 删除软链接
sudo ln -s python3 python # 建立软链接
python --version # 可以看到这里版本已经顺利切换
2.2 下面全程是root账户操作,执行bcc/tools目录工具时提示以下错误
libbpf :failed to find '.BTF' ELF section in /lib/modu;es/5.10.73/build/vmlinux
llvm Error:
或者是下面这个 (这个是执行bcc/example/hello_world.py文件时报的错误)
解决方法: 解决bcc/tools目录工具问题后,example文件顺利执行
关键点:
https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source # 看前置环境
https://blog.csdn.net/SHELLCODE_8BIT/article/details/132266380 # 一般ubuntu对应的内核版本
踩坑点:
linux内核配置需要有依赖,当我把BTF=y配置后发现会自动重写我的.config文件,查找后发现一个组件的编译依赖于其他组件,需要到源码的lib/Kconfig.debug文件下查看依赖关系
# 可能还需要配置这个,我是配置了的
https://blog.csdn.net/chensong_2000/article/details/107978723?spm=1001.2014.3001.5501
将依赖的组件在config文件中设置即可, !的意思是不设置即可
编译的时候使用sudo make -j8 可以导致内存不足
要是出现类似错误,增加交换区或者减少线程
free -h # 查看内存和交换区
https://zhuanlan.zhihu.com/p/480903179 ## 具体设置可以参考这个网站
可能还有新问题,例如下面这个
2. 修复bcc版本和内核版本环境不匹配问题
启动BTF之后,之前的错误就只剩下了 llvm Error问题, 经查找后发现是llvm问题,删除bcc包
sudo make uninstall
查找bcc作者的配置表,发现我们的内核版本所需的llvm11,但作者给出的ubuntu18.04中装了llvm6,原本是打算直接使用
sudo apt install -y zip bison build-essential cmake flex git libedit-dev
libllvm11 llvm-11-dev libclang-11-dev python3 zlib1g-dev libelf-dev libfl-dev python3-setuptools
liblzma-dev arping netperf iperf
但是出现了这个问题,没办法只能手动编译安装llvm11了
主要根据这个网站www.cnblogs.com/lifeislife/… 进行配置,进入到github源码下载llvm11.01的包(网站里面给出的llvm11.0编译失败过不了,现在想想可能是上面那个内存的问题)
这里一定要先编译llvm而不是clang
https://github.com/llvm/llvm-project/releases # 找到所需的demo,下载
tar xvf llvm11# 解压
cd llvm11
cd llvm # 这里一定要先编译llvm,不能先去编译clang,clang是依赖于llvm,切记切记
mkdir build && cd build
camke ..
sudo make -j2 # 这里报了错看是不是和前面内存一样,照着改就可以了
sudo make install
llvm-config --version # 版本是否正确
编译完llvm后回到代码根目录
cd clang
mkdir build && cd build
cmake ..
sudo make -j2
sudo make install
clang --version
直至,前置环境解决,开始重新编译bcc代码,见前文。
之后,到bcc的tools目录下(root账号), 这里要注意python版本的问题,python --version结果要是3
运行,没有报错。测试example文件
结果正确,至此,perf 配置完成, bcc工具配置完成!(总共3天,踩了很多坑,很多看到的解决方案是某个网页中的某一行,也收获了很多,英文确实很重要)