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

相关推荐
代码AC不AC5 分钟前
【Linux】关于 mmap 文件映射
linux·mmap 文件映射
me8325 分钟前
【Linux】解决Docker-Compose拉取Jenkins时失败问题。
linux·docker·jenkins
kaoa00018 分钟前
Linux入门攻坚——73、运维OS Provisioning阶段工具之PXE、Cobbler
linux·运维
Lugas Luo22 分钟前
SATA Port Multiplier (SATA 集线器) 原理与驱动架构深度剖析
linux·嵌入式硬件
123过去26 分钟前
fcrackzip使用教程
linux·网络·测试工具·安全
水月天涯36 分钟前
Mac系统下制作 Ubuntu镜像(小白教程)
linux·ubuntu·macos
A.A呐36 分钟前
【Linux第二十三章】传输层
linux·运维·服务器
Yupureki36 分钟前
《Linux网络编程》1.网络基础
linux·运维·服务器·c语言·网络·c++
kongba00739 分钟前
复刻 Claude Code 项目御马术缰绳系统 harness engineering 落地蓝图
java·linux·服务器
RisunJan1 小时前
Linux命令-mysqldump(MySQL数据库中备份工具)
linux·数据库·mysql