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

一、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.0extra_paholeopt=if ! [ -x "$(command -v ${PAHOLE})" ]; thenexit
fipahole_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 varsextra_paholeopt="${extra_paholeopt} --skip_encoding_btf_vars"
fi
if [ "${pahole_ver}" -ge "121" ]; thenextra_paholeopt="${extra_paholeopt} --btf_gen_floats"
fiif [ "${pahole_ver}" -ge "124" ]; thenextra_paholeopt="${extra_paholeopt} --skip_encoding_btf_enum64"
fiecho ${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.xdnf.cn/news/1451619.html

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

相关文章

Navicat和SQLynx产品功能比较一(整体比较)

Navicat和SQLynx都是数据库管理工具&#xff0c;在过去的二十年中&#xff0c;国内用户主要是使用Navicat偏多&#xff0c;一般是个人简单开发需要&#xff0c;数据量一般不大&#xff0c;开发相对简单。SQLynx是最近几年的数据库管理工具&#xff0c;Web开发&#xff0c;桌面版…

物联网对智慧驾考应用的价值

随着物联网技术的快速发展&#xff0c;传统行业正经历着前所未有的变革。在智慧驾考领域&#xff0c;4G DTU&#xff08;数据传输单元&#xff09;和工业路由器的应用&#xff0c;不仅提升了考试的规范性和效率&#xff0c;更为驾考行业带来了深远影响。作为工业物联网的资深工…

如何下载proDAD V4软件及详细安装步骤

简介&#xff1a; proDAD Adorage 是一款一体化的效果库&#xff0c;完美拥有所有的效果&#xff0c;集所有Adorage卷于一体&#xff0c;该系列包含13种可用套装中的17,000多种效果。 对于每种情况都能获得完美的效果&#xff0c;支持Adobe、avid、Corel、Cyberlink、MAGIX等多…

Capto2024软件怎么下载安装? 【详细安装图文教程】

Capto 2024是一款专为Mac用户设计的屏幕录制编辑软件。无论是想要制作教育视频、工作演示、游戏录制&#xff0c;还是进行简单的屏幕捕捉&#xff0c;Capto 2024都能满足您的需求。接下来&#xff0c;我将详细介绍其主要功能、特点以及使用场景&#xff0c;并为您评价这款软件。…

简单了解MySql以及一些简单的应用MySql

MySql基础篇 1、数据模型概述 关系型数据库 概念&#xff1a;建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库。 特点&#xff1a; 使用表存储数据&#xff0c;格式统一&#xff0c;便于维护使用SQL语言操作&#xff0c;标准统一&#xff0c;使用方便 数…

fuel无人机自主探索代码解读3——fast_exploration_fsm.cpp【状态机】

一、概述 fast_exploration_fsm.cpp订阅实时定位和目标点信息&#xff0c;每隔0.01s执行一次状态机&#xff0c;进行状态切换&#xff1b;每隔0.05s执行一次碰撞检测&#xff0c;按需进行重新规划&#xff1b;每0.5s执行一次边界回调定时器&#xff0c;对于处于WAIT_TRIGGER和…

中国首台!紧随美国,重磅发布100比特中性原子量子计算机

2024年6月11日上午&#xff0c;“武汉量子论坛—2024”隆重开幕&#xff0c;国家自然科学基金委员会主任窦贤康院士&#xff0c;武汉大学校长张平文院士&#xff0c;以及叶朝辉、徐红星、祝世宁等院士出席大会。在会议上&#xff0c;中科酷原重磅发布国内首台原子量子计算机——…

【数据结构初阶】--- 栈和队列

栈 栈的定义 栈&#xff1a;只允许在一端进行插入或删除的操作 事实上&#xff0c;线性表和链表都可以实现栈&#xff0c;但栈的特点更符合用顺序表实现 顺序表的队尾相当于栈顶&#xff0c;对栈放入数据&#xff0c;相当于顺序表的下标arr[index] x&#xff0c;而栈弹出数…

threejs导入import报错

1.安装 three&#xff1a; npm install three -d 2.引入&#xff1a; import * as THREE from "three"import { OrbitControls } from "three/examples/controls/OrbitControls.js" 报错&#xff1a; 3.解决办法&#xff1a; 3.1引入&#xff1a; im…

车道偏离预警系统技术规范(简化版)

车道偏离预警系统技术规范(简化版) 1 系统概述2 预警区域3 功能条件4 显示需求5 指标需求1 系统概述 车道偏离预警系统工作在中高速驾驶的情况下,当驾驶员因注意力不集中导致车辆偏离本车道时,系统通过光学和声学信号对驾驶员进行提醒,减少因此导致的交通事故。功能主要依…

嵌入式操作系统_4.任务管理

1.任务的概念 任务管理是嵌入式操作系统最基本功能之一&#xff0c;这里的任务&#xff08;task&#xff09;是指嵌入式操作系统调度的最小单位&#xff0c;类似于一般操作系统进程或线程的概念。任务是运行中的一个程序&#xff0c;一个程序加载到内存后就变成任务&#xff1…

将自己md文件发布到自己的博客园实现文件的持久化存储

上传markdown文件到博客园 目录 【0】需求原因【1】功能【2】环境【最佳实践测试】 &#xff08;1&#xff09;查看 Typora 设置&#xff08;2&#xff09;配置 pycnblog 配置文件 config.yaml&#xff08;3&#xff09;运行 pycnblog 中的文件 cnblog_markdown.cmd&#xff0…

基于hispark_taurus开发板示例学习OpenHarmony编译构建系统(2)

3、hispark_taurus产品解决方案-Vendor 产品解决方案为基于开发板的完整产品&#xff0c;主要包含产品对OS的适配、组件拼装配置、启动配置和文件系统配置等。产品解决方案的源码路径规则为&#xff1a;vendor/{产品解决方案厂商}/{产品名称}_。_产品解决方案也是一个特殊的组…

CentOs7 安装mysql5.7

1.卸载原系统中的mariadb…… 首先执行命令rpm -qa|grep mariadb查看是否有mariadb的安装包&#xff0c;没有可以不管 接下来&#xff0c;执行 rpm -e --nodeps mariadb-libs #删除掉下载mysql5.7安装包 1.前往官方网站复制yum源链接Mysql官网 然后鼠标右键粘贴 wget 执行…

信息系统架构风格-系统架构师(十)

1、信息系统架构风格是描述特定应用领域中系统组织方式的惯用模式。架构风格定义了一个系统家族&#xff0c;即一个架构定义&#xff08;&#xff09;。 A一组设计原则 B一组模式 C一个词汇表和一组约束 D一组最佳实践 解析&#xff1a; 信息系统架构风格是描述某一特定 应…

OrangePi Kunpeng Pro 安装 ROS2 + Gazebo

文章目录 1. 初识1.1 到手开箱1.2 OrangePi Kunpeng Pro1.2 上电 2. 安装Ubuntu2.1 准备工作2.2 安装 3. 安装ROS23.1 设置支持UTF-8的locale编码3.2 添加证书3.3 安装ROS3.4 设置环境变量3.5 小海龟来啦 4. 运行实例4.1 安装Gazebo4.2 安装turtlebot 总结 1. 初识 1.1 到手开…

机器学习python实践——数据“相关性“的一些补充性个人思考

在上一篇“数据白化”的文章中&#xff0c;说到了数据“相关性”的概念&#xff0c;但是在统计学中&#xff0c;不仅存在“相关性”还存在“独立性”等等&#xff0c;所以&#xff0c;本文主要对数据“相关性”进行一些补充。当然&#xff0c;如果这篇文章还能入得了各位“看官…

openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写

文章目录 openGauss学习笔记-300 openGauss AI特性-AI4DB数据库自治运维-DBMind的AI子功能-SQL Rewriter SQL语句改写300.1 概述300.2 使用指导300.2.1 前提条件300.2.2 使用方法示例300.3 获取帮助300.4 命令参考300.5 常见问题处理openGauss学习笔记-300 openGauss AI特性-AI…

MySQL问题篇2:关于IN字段不按照顺序返回问题

一、发现问题 数据库表结构如下&#xff1a; 其查询语句如下&#xff1a; SELECT* FROMdepartment WHEREdepartment_id IN (5,4,2,3,1) 其返回结果如下&#xff1a; 到此处我们发现了问题&#xff0c;其中我in写的是&#xff08;5,4,2,3,1&#xff09;&#xff0c;其返回结果顺…

vue+elementUI实现在表格中添加输入框并校验的功能

背景&#xff1a; vue2elmui 需求&#xff1a; 需要在一个table中添加若干个输入框&#xff0c;并且在提交时需要添加校验 思路&#xff1a; 当需要校验的时候可以考虑添加form表单来触发校验&#xff0c;因此需要在table外面套一层form表单&#xff0c;表单的属性就是ref…