Perf + BCC 性能分析工具使用

2023年 10月 8日 45.2k 0

安装

  • 查看内核版本(Ubuntu)
  • 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
    

    结果

    Perf + BCC 性能分析工具使用-1

    分析

    火焰图中出现了很多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 报错

    1.PNG

    解决方法: 切换至管理员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文件时报的错误)

    2.PNG

    解决方法: 解决bcc/tools目录工具问题后,example文件顺利执行

    关键点:

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

    踩坑点:

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

    3.png

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

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

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

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

    4.PNG

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

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

    10.PNG

    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了

    5.PNG

    主要根据这个网站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

    7.png
    运行,没有报错。测试example文件

    8.png

    结果正确,至此,perf 配置完成, bcc工具配置完成!(总共3天,踩了很多坑,很多看到的解决方案是某个网页中的某一行,也收获了很多,英文确实很重要)

    相关文章

    JavaScript2024新功能:Object.groupBy、正则表达式v标志
    PHP trim 函数对多字节字符的使用和限制
    新函数 json_validate() 、randomizer 类扩展…20 个PHP 8.3 新特性全面解析
    使用HTMX为WordPress增效:如何在不使用复杂框架的情况下增强平台功能
    为React 19做准备:WordPress 6.6用户指南
    如何删除WordPress中的所有评论

    发布评论