Perf + BCC 性能分析工具使用

安装

  1. 查看内核版本(Ubuntu)
bash 复制代码
uname -r 

由于我之前升级了内核版本(6.2.1),故直接以下命令并不能成功安装perf工具(使用perf命令无法成功)

sql 复制代码
sudo apt-get install linux-tools-common
perf --version
  1. 如果上面能成功的话这部分可以跳过
bash 复制代码
# 找到自己内核版本的内核源码路径 (也可以网上直接下载)
# [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

使用

bash 复制代码
# 用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)

bash 复制代码
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工具进行分析

主要参考网站:

perl 复制代码
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

bash 复制代码
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

bash 复制代码
su
vim ~/.bashrc
export PYTHONPATH=/lib/python3/dist-packages:$PYTHONPATH
source ~/.bashrc # 配置生效
echo $PYTHONPATH # 打印是否正确配置
make install

2. 版本适配问题,python问题

2.1 确保系统版本python为python3而不是python2
bash 复制代码
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文件顺利执行

关键点:

  1. linux 内核版本与bcc 环境适配
  2. linux 内核开启BTF
  3. 由于我个人的内核升级过,所以不能安装bcc作者的ubuntu适配表来,要查找对应的内核版本
ruby 复制代码
https://github.com/iovisor/bcc/blob/master/INSTALL.md#ubuntu---source # 看前置环境
https://blog.csdn.net/SHELLCODE_8BIT/article/details/132266380 # 一般ubuntu对应的内核版本
  1. 内核BTF功能开启 (内核配置可以看我之前的文章)

踩坑点:

linux内核配置需要有依赖,当我把BTF=y配置后发现会自动重写我的.config文件,查找后发现一个组件的编译依赖于其他组件,需要到源码的lib/Kconfig.debug文件下查看依赖关系

bash 复制代码
# 可能还需要配置这个,我是配置了的
https://blog.csdn.net/chensong_2000/article/details/107978723?spm=1001.2014.3001.5501 

将依赖的组件在config文件中设置即可, !的意思是不设置即可

编译的时候使用sudo make -j8 可以导致内存不足

要是出现类似错误,增加交换区或者减少线程

bash 复制代码
free -h # 查看内存和交换区
https://zhuanlan.zhihu.com/p/480903179  ## 具体设置可以参考这个网站

可能还有新问题,例如下面这个

2. 修复bcc版本和内核版本环境不匹配问题 启动BTF之后,之前的错误就只剩下了 llvm Error问题, 经查找后发现是llvm问题,删除bcc包

go 复制代码
sudo make uninstall

查找bcc作者的配置表,发现我们的内核版本所需的llvm11,但作者给出的ubuntu18.04中装了llvm6,原本是打算直接使用

css 复制代码
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

bash 复制代码
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后回到代码根目录

bash 复制代码
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天,踩了很多坑,很多看到的解决方案是某个网页中的某一行,也收获了很多,英文确实很重要)

相关推荐
学习3人组24 分钟前
CentOS安装Hadoop系列
linux·hadoop·centos
Length-vision43 分钟前
Linux入门学习:Linux调试器gdb使用
linux·学习
技术不支持1 小时前
WSL2+Ubuntu 22.04搭建Qt开发环境+中文输入法
linux·运维·服务器·qt·ubuntu
木人舟1 小时前
以root用户登陆ubuntu的桌面环境
linux·运维·ubuntu
几度热忱1 小时前
【Ubuntu】Ubuntu双网卡配置 实现内外网互不影响同时可用
linux·运维·ubuntu
打工人0071 小时前
ubuntu 执行定时任务crontab -e 无法输入的问题
linux·运维·ubuntu
IOT.FIVE.NO.11 小时前
ubuntu个人实用配置问题
linux·运维·ubuntu
_infinite_1 小时前
Ubuntu 与Uboot网络共享资源
linux·服务器·ubuntu
masterMono1 小时前
Ubuntu中常用的操作指令
linux·运维·ubuntu
佚明zj1 小时前
ubuntu如何进行自动mount硬盘(简易法)
linux·运维·ubuntu