Linux之BCC 性能工具的移植和使用

news2024/10/6 4:11:18

一、bcc 工具

bcc 的全称:BPF Compiler Collection

BCC(BPF Compiler Collection)是一个用于创建高效的内核跟踪和操作程序的工具包,包含了几个有用的工具和示例。它利用了扩展的BPF(Berkeley Packet Filters),即eBPF,这是一个最早添加到Linux 3.15的新特性。大部分BCC所使用的功能要求Linux 4.1及以上版本。

eBPF被Ingo Molnár描述为:

在这个周期内更有趣的特性之一是能够将eBPF程序(用户定义的、在内核中执行的沙箱化的字节码)附加到kprobes上。这允许对实时内核镜像进行用户定义的仪表化,这些程序永远不会崩溃、挂起或对内核产生负面影响。

BCC使得编写BPF程序更加容易,它使用C语言编写内核仪表化程序(并在LLVM周围包含了一个C语言包装器),并提供了Python和lua的前端。它适用于许多任务,包括性能分析和网络流量控制。

二、bcc 编译

bcc 源码路径:

GitHub - iovisor/bcc: BCC - Tools for BPFicon-default.png?t=N7T8https://github.com/iovisor/bcc/tree/master

2.1 内核配置选项的打开:

In general, to use these features, a Linux kernel version 4.1 or newer is required. In addition, the kernel should have been compiled with the following flags set:

CONFIG_BPF=y
CONFIG_BPF_SYSCALL=y
# [optional, for tc filters]
CONFIG_NET_CLS_BPF=m
# [optional, for tc actions]
CONFIG_NET_ACT_BPF=m
CONFIG_BPF_JIT=y
# [for Linux kernel versions 4.1 through 4.6]
CONFIG_HAVE_BPF_JIT=y
# [for Linux kernel versions 4.7 and later]
CONFIG_HAVE_EBPF_JIT=y
# [optional, for kprobes]
CONFIG_BPF_EVENTS=y
# Need kernel headers through /sys/kernel/kheaders.tar.xz
CONFIG_IKHEADERS=y

 There are a few optional kernel flags needed for running bcc networking examples on vanilla kernel:

 CONFIG_NET_SCH_SFQ=m
CONFIG_NET_ACT_POLICE=m
CONFIG_NET_ACT_GACT=m
CONFIG_DUMMY=m
CONFIG_VXLAN=m

 Kernel compile flags can usually be checked by looking at /proc/config.gz or /boot/config-<kernel-version>.

上面的内核配置选项都是github上官方给出的配置选项,但是在使用bcc过程中,会遇到一些问题,需要增加打开内核的选项,如下所示:

1、执行 execsnoop 时,报错:

 解决办法:

打开内核选项:CONFIG_DEBUG_INFO_BTF=y

BTF是什么?

BTF 是 Linux 内核中的一种功能,全称为 BPF Type Format。BTF 最初是为 eBPF(扩展 Berkeley Packet Filter)引入的,但它在内核中的使用已经远远超出了 eBPF 的范畴。

BTF 的主要功能是提供一种将内核数据结构描述导出到用户空间的方法,以便用户空间的程序(如调试器、静态分析工具等)能够了解内核数据结构的布局和语义。具体来说,BTF 提供了以下功能:

  1. 类型信息: BTF 包含了内核数据结构的类型信息,如结构体、联合体、枚举类型等,以及它们的成员和类型信息。

  2. 函数信息: BTF 还包含了内核函数的信息,如参数类型、返回类型等。

  3. 源代码位置信息: BTF 还可以包含源代码位置信息,以帮助调试器等工具定位内核代码中的位置。

BTF 的引入使得用户空间的工具能够更好地理解内核数据结构,从而实现更高效的调试、性能分析和安全分析等功能。例如,调试器可以使用 BTF 来显示内核中的变量和数据结构,静态分析工具可以使用 BTF 来检查内核中的代码逻辑,而不必依赖于手动编写解析内核数据结构的代码。

总的来说,BTF 是 Linux 内核中的一种功能,用于将内核数据结构描述导出到用户空间,以帮助用户空间的工具更好地理解和分析内核代码。

----接着打开选项后,又遇到编译 的问题,如下:

FAILED:load BTF from vmlinux:

解决办法:

下载 pahole 的包,可以解决;但是下载的包版本不对,还是会报这个错误。

我遇到的问题是:安装 pahole-1.25 版本,还是报上面的错误,安装pahole-1.22-8,得以解决;

 百度了一下 pahole-1.25版本的解决办法,使用之后没有解决,不知道什么原因。

下面先写出网友的解决办法:

 diff --git a/scripts/pahole-flags.sh b/scripts/pahole-flags.sh
> index 0d99ef17e4a528..1f1f1d397c399a 100755
> --- a/scripts/pahole-flags.sh
> +++ b/scripts/pahole-flags.sh
> @@ -19,5 +19,9 @@ fi
>  if [ "${pahole_ver}" -ge "122" ]; then
>         extra_paholeopt="${extra_paholeopt} -j"
>  fi
> +if [ "${pahole_ver}" -ge "124" ]; then
> +       # see PAHOLE_HAS_LANG_EXCLUDE
> +       extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_enum64"
> +fi
> 
>  echo ${extra_paholeopt}
> 

上面的pahole-flags.sh 文件也只是存在内核5.15版本以上吧,具体没有去核实,只是我的内核5.10 的版本里面没有上面的pahole-flags.sh 脚本。但是,有./scripts/link-vmlinux.sh

增加修改后的link-vmlinux.sh,但是没有解决这个问题,只是用于展示解决问题的过程。

去查看内核5.15 的pahole-flags.sh 脚本,内容如下:

#!/bin/sh
# SPDX-License-Identifier: GPL-2.0

extra_paholeopt=

if ! [ -x "$(command -v ${PAHOLE})" ]; then
        exit
fi

pahole_ver=$($(dirname $0)/pahole-version.sh ${PAHOLE})

if [ "${pahole_ver}" -ge "118" ] && [ "${pahole_ver}" -le "121" ]; then
        # pahole 1.18 through 1.21 can't handle zero-sized per-CPU vars
        extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_vars"
fi
if [ "${pahole_ver}" -ge "121" ]; then
        extra_paholeopt="${extra_paholeopt} --btf_gen_floats"
fi

if [ "${pahole_ver}" -ge "124" ]; then
        extra_paholeopt="${extra_paholeopt} --skip_encoding_btf_enum64"
fi

echo ${extra_paholeopt}
~

看内容 ,内核版本越高,pahole高版本带来的问题也就解决了。

2、执行 cachestat 1 3 ,报错

解决办法:

打开内核的debug_fs 的功能,重新编译然后烧录内核。

系统起来后,确保:mount -t debugfs debugfs /sys/kernel/debug 

 2.2 Repositories

/etc/apt/sources.list should include the non-free repository and look something like this:

deb http://deb.debian.org/debian sid main contrib non-free
deb-src http://deb.debian.org/debian sid main contrib non-free

 2.3 Install Build Dependencies

# Before you begin
apt-get update
# According to https://packages.debian.org/source/sid/bpfcc,
# BCC build dependencies:
sudo apt-get install arping bison  cmake dh-python \
  dpkg-dev pkg-kde-tools ethtool flex inetutils-ping iperf \
  libbpf-dev  libedit-dev libelf-dev \
  libfl-dev libzip-dev linux-libc-dev libluajit-5.1-dev \
  luajit python3-netaddr python3-pyroute2 python3-setuptools python3 

 注意:llvm 和clang  不能下载 10版本,否则编译不过。需要下载 12版本。

sudo apt install -y  build-essential cmake flex   \
  libllvm12 llvm-12-dev libclang-12-dev  zlib1g-dev \
  liblzma-dev  netperf iperf

netperf 是安装不了的,需要单独下载 源码编译安装。如果不安装,也是可以编译过的,可能会有一些功能使用不了。如果到时需要,在下载安装重新编译。

版本要求:

  • LLVM 3.7.1 or newer, compiled with BPF support (default=on) 
  • Clang, built from the same tree as LLVM
  • cmake (>=3.1), gcc (>=4.7), flex, bison
  • LuaJIT, if you want Lua support
  • Optional tools used in some examples: arping, netperf, and iperf
2.4 确保默认的python版本是3:

whereis python3
#python3: /usr/bin/python3

 设置Python的默认为python3

sudo update-alternatives --install /usr/bin/python python /usr/bin/python3 100
#update-alternatives: using /usr/bin/python3 to provide /usr/bin/python (python) in auto mode

2.5 Install and compile BCC

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

 

make install 安装的 路径:/usr/share/bcc/

 也可以手动修改安装路径:

cmake .. -DCMAKE_INSTALL_PREFIX=/usr (路径自定义)

 如果使用默认,可以把路径添加到$PATH中,

bcctools=/usr/share/bcc/tools
bccexamples=/usr/share/bcc/examples
export PATH=$bcctools:$bccexamples:$PATH

 三、bcc 工具的使用

3.1 bitesize

 数据抓取成功。

3.2 cachestat 1 3

因为内核没有打开debugfs ,所以会报错:

 需要打开内核debugfs,并挂载debugfs

mount -t debugfs debugfs /sys/kernel/debug

 解决之后:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1830269.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

【C/C++】【学生成绩管理系统】深度剖析

可接各类C/C管理系统课设 目录 实现功能 部分1&#xff1a;系统设置和主菜单 1. 引入头文件 2. 定义结构体 3. 函数声明 4. 主函数 部分2&#xff1a;添加学生信息 部分3&#xff1a;删除学生信息 部分4&#xff1a;修改学生信息 部分5&#xff1a;查询学生信息 部分…

大众点评_token,mtgsig

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 本文章未经许可禁止转载&#xff0…

以太网基础知识(三)—FEC概念以及编码原理介绍

1&#xff1a;前言 KR4(528,514) FEC表示的意思&#xff1a; KR4 RS(528,514) FEC 是一种以太网中使用的FEC&#xff08;Forward Error Correction&#xff09;编码方案。在这个方案中&#xff0c;采用的是Reed-Solomon (RS) 编码算法&#xff0c;它被设计用于提高数据传输的…

9M高速USB转接芯片CH347转双串口转I2C转SPI转JTAG转SWD

1、概述 CH347 TSSOP20封装和丝印 CH347 是一款高速 USB 总线转接芯片&#xff0c;通过 USB 总线提供异步串口、I2C 同步串行接口、SPI 同步串行接口和 JTAG 接口等。 在异步串口方式下&#xff0c;CH347 提供了 2 个高速串口&#xff0c;支持 RS485 串口收发使能控制、硬件流控…

论文阅读:基于谱分析的全新早停策略

来自JMLR的一篇论文&#xff0c;https://www.jmlr.org/papers/volume24/21-1441/21-1441.pdf 这篇文章试图通过分析模型权重矩阵的频谱来解释模型&#xff0c;并在此基础上提出了一种用于早停的频谱标准。 1&#xff0c;分类难度对权重矩阵谱的影响 1.1 相关研究 在最近针对…

SN74HC14+陶瓷振子做振荡器的试验初步

本想试验一下465khz用SN74HC14做振荡器&#xff0c;实验了很多次&#xff0c;无法起振。 用1M&#xff0c;4M的也无法起振&#xff0c;用到10Mhz时&#xff0c;能起振&#xff0c;用小频谱仪看&#xff0c;谐波相当丰富&#xff0c;从10M到300Mhz&#xff0c;当然我是通过实验在…

python14 字典类型

字典类型 键值对方式&#xff0c;可变数据类型&#xff0c;所以有增删改功能 声明方式1 {} 大括号&#xff0c;示例 d {key1 : value1, key2 : value2, key3 : value3 ....} 声明方式2 使用内置函数 dict() 创建1)通过映射函数创建字典zip(list1,list2) 继承了序列的所有操作 …

第零篇——数学到底应该怎么学?

目录 一、背景介绍二、思路&方案三、过程1.思维导图2.文章中经典的句子理解3.学习之后对于投资市场的理解4.通过这篇文章结合我知道的东西我能想到什么&#xff1f; 四、总结五、升华 一、背景介绍 宏观讲解数学定位&#xff0c;数学学习方式方法&#xff0c;再次详细学习…

C# OpenCV 部署RecRecNet广角图像畸变矫正

C# OpenCV 部署RecRecNet广角图像畸变矫正 目录 说明 效果 模型信息 项目 代码 下载 说明 ICCV2023 - RecRecNet: Rectangling Rectified Wide-Angle Images by Thin-Plate Spline Model and DoF-based Curriculum Learning 参考&#xff1a; https://github.com/Kang…

Vue52-scoped样式

一、scoped样式的作用 1-1、scoped样式的作用 vue中组件的样式都是汇总到一起的。容易出现一个问题&#xff1a;类名冲突。 示例&#xff1a; school和student组件的类名都叫demo&#xff0c;则student的样式将覆盖school的样式&#xff0c;因为App.vue中&#xff0c;先引入的…

Spring事务管理、SpringAop

目录 ​编辑 Spring事务管理 注解:Transactional rollbackFor 事务属性-传播行为 propagation SpringAOP AOP核心概念 通知类型 通知顺序 切入点表达式 切入点表达式-execution 切入点表达式-annotation 连接点 ​编辑 将案例中 增、删、改 相关接口的操作日志记…

unity跑酷游戏(源码)

包括&#xff1a;触发机关&#xff0c; 优化 fog的调试 效果 碰到障碍物游戏时间暂停&#xff08;挂载到障碍物上&#xff09; 上面需要有碰撞体 游戏物体上需要有标签 using System.Collections; using System.Collections.Generic; using UnityEngine;public class Barri…

【仿真建模-anylogic】FlowchartBlock原理解析

Author&#xff1a;赵志乾 Date&#xff1a;2024-06-17 Declaration&#xff1a;All Right Reserved&#xff01;&#xff01;&#xff01; 1. 类图 2. 原理解析 2.1 核心函数 函数功能FlowchartBlock(Engine engine ,Agent owner, AgentList population )构造函数&#xff…

C语言王国——深入自定义类型(结构体)

目录 一、引言 二、结构体 1. 结构体类型的声明 2. 结构体变量的创建和初始化 2.1 创建 2.2 初始化 2.3 typedef 2.4 特殊声明 2.5 自引用 3. 结构成员访问操作符 4. 结构体内存对齐 4.1 对齐规则 4.2 offsetof 4.3 为什么存在内存对齐 5. 结构体传参 6. 结构体实现…

仅靠独立网站也能赚到100万,真的太牛了

你听说过 Photopea 吗&#xff1f;这是一个免费的类似 Photoshop 的图像编辑器。 这个项目&#xff1a; 每月1300万访问量每月150万用户使用小时每月10万美元的广告收入 Photopea 项目的天才创造者是 Ivan Kutskir。 令人惊讶的是&#xff0c;他独自处理了每日50万用户&…

数组趣味玩法:在Java SE中尝试创新玩法

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

C++ | Leetcode C++题解之第160题相交链表

题目&#xff1a; 题解&#xff1a; class Solution { public:ListNode *getIntersectionNode(ListNode *headA, ListNode *headB) {if (headA nullptr || headB nullptr) {return nullptr;}ListNode *pA headA, *pB headB;while (pA ! pB) {pA pA nullptr ? headB : p…

【Vue3】插槽的使用及其分类

历史小剧场 后来我才明白&#xff0c;造反的宋江&#xff0c;和招安的宋江&#xff0c;始终是同一个人。 为什么要造反&#xff1f; 造反&#xff0c;就是为了招安。 ----《明朝那些事儿》 概念 在日常的项目开发中&#xff0c;当我们在编写一个完整的组件时&#xff0c;不可避…

款基于SpringBoot+Vue+ElementUI技术栈开发的自定义表单工具(已开源)

TDuck填鸭表单是一个开源的问卷调查系统&#xff0c;一款基于SpringBootVueElementUI技术栈开发的自定义表单工具&#xff0c;它不仅支持问卷调查&#xff0c;还能进行数据收集。TDuck团队经过两年的优化&#xff0c;使得社区版功能趋于稳定。2023年5月&#xff0c;团队推出了可…

flstudio怎么调中文

FL Studio设置中文的步骤如下&#xff1a; 打开FL Studio&#xff1a;首先&#xff0c;需要打开FL Studio编曲软件。 进入常规设置&#xff1a;在软件顶部菜单栏中&#xff0c;选择“OPTIONS”&#xff0c;然后点击“General setting”&#xff0c;进入常规设置窗口。 切换语言…