BPF:BCC(BPF Compiler Collection)工具集认知

写在前面


  • 博文内容为 《BPF Performance Tools》 读书笔记整理
  • 内容涉及 BCC 工具整体介绍
  • 理解不足小伙伴帮忙指正 😃,生活加油

不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经和从前不一样了。——村上春树


简单介绍

BCC(BPF Compiler Collection)是一个开源项目,全称为BPF编译器集合,主要用于构建BPF(Berkeley Packet Filter,特别是eBPF,即扩展BPF)软件。允许开发者使用C、Python、Lua等语言编写高效且安全的内核追踪和操作程序,支持kprobes、uprobes等动态跟踪技术,并提供了静态跟踪、性能分析、网络流量控制等多种功能,是Linux内核编程和性能调优的强大工具集。

使用场景

  • 网络性能调优:通过 eBPF 触发和监控网络事件,如分析网络包的流经路径、计算网络延迟等。
  • 内存性能分析:使用 BCC 工具集中的内存相关工具,如 memleak、memcache 等,监控进程的内存分配和释放情况。
  • 文件系统性能优化:通过 BCC 工具集中的 ftrace、ext4slower 等工具,监控文件系统的读写操作。
  • 调试和故障排查:利用 BCC 和 BPF 技术进行调试和故障排查。

BCC 的组件

开源项目地址:https://github.com/iovisor/bcc

git clone https://github.com/iovisor/bcc.git

目录结构

liruilonger@cloudshell:~/bcc$ tree -L 1
.
├── cmake
├── CMakeLists.txt
├── CODEOWNERS
├── CONTRIBUTING-SCRIPTS.md
├── debian
├── docker
├── docs
├── examples
├── FAQ.txt
├── images
├── INSTALL.md
├── introspection
├── libbpf-tools
├── LICENSE.txt
├── LINKS.md
├── man
├── QUICKSTART.md
├── README.md
├── scripts
├── snap
├── SPECS
├── src
├── tests
└── tools

15 directories, 9 files
liruilonger@cloudshell:~/bcc$

tools 主要为工具和example

liruilonger@cloudshell:~/bcc/tools$ ls
argdist_example.txt       filegone_example.txt        oomkill.py               swapin_example.txt
argdist.py                filegone.py                 opensnoop_example.txt    swapin.py
bashreadline_example.txt  filelife_example.txt        opensnoop.py             syncsnoop_example.txt
bashreadline.py           filelife.py                 perlcalls_example.txt    syncsnoop.py
bindsnoop_example.txt     fileslower_example.txt      perlcalls.sh             syscount_example.txt
bindsnoop.py              fileslower.py               perlflow_example.txt     syscount.py
biolatency_example.txt    filetop_example.txt         perlflow.sh              tclcalls_example.txt
biolatency.py             filetop.py                  perlstat_example.txt     tclcalls.sh
biolatpcts_example.txt    funccount_example.txt       perlstat.sh              tclflow_example.txt
biolatpcts.py             funccount.py                phpcalls_example.txt     tclflow.sh
biopattern_example.txt    funcinterval_example.txt    phpcalls.sh              tclobjnew_example.txt
biopattern.py             funcinterval.py             phpflow_example.txt      tclobjnew.sh
biosnoop_example.txt      funclatency_example.txt     phpflow.sh               tclstat_example.txt
biosnoop.lua              funclatency.py              phpstat_example.txt      tclstat.sh
biosnoop.py               funcslower_example.txt      phpstat.sh               tcpaccept_example.txt
biotop_example.txt        funcslower.py               pidpersec_example.txt    tcpaccept.py
biotop.py                 gethostlatency_example.txt  pidpersec.py             tcpcong_example.txt

man 主要为帮助文档

liruilonger@cloudshell:~/bcc/man$ tree -L 1
.
├── CMakeLists.txt
└── man8

1 directory, 1 file
liruilonger@cloudshell:~/bcc/man$ cd man8/
liruilonger@cloudshell:~/bcc/man/man8$ tree .
.
├── argdist.8
├── bashreadline.8
├── bindsnoop.8
├── biolatency.8
├── biolatpcts.8
├── biopattern.8
├── biosnoop.8
├── biotop.8
├── bitesize.8

doc 为参考指南以及教程

liruilonger@cloudshell:~/bcc/docs$ tree .
.
├── kernel_config.md
├── kernel-versions.md
├── reference_guide.md
├── special_filtering.md
├── tutorial_bcc_python_developer.md
└── tutorial.md

0 directories, 6 files
liruilonger@cloudshell:~/bcc/docs$

src 为源代码

liruilonger@cloudshell:~/bcc$ cd src/
liruilonger@cloudshell:~/bcc/src$ tree -L 1
.
├── cc
├── CMakeLists.txt
├── lua
└── python

3 directories, 1 file
liruilonger@cloudshell:~/bcc/src$

查看安装目录

liruilonger@cloudshell:~$ dpkg -L bpfcc-tools

BCC 的特性

CC 的内核态特性

BCC 会使用不少内核态的特性,比如BPF、kprobes、uprobes等。下面这个清单的括号中的内容包含了一些实现细节

  • 动态插桩,内核态(kprobes 的 BPF 支持)
  • 动态插桩,用户态(uprobes 的 BPF 支持)
  • 静态跟踪,内核态(跟踪点的 BPF 支持)
  • 时间采样事件(BPF,使用 perf_event_open())
  • PMC 事件(BPF,使用 perf_event_open())
  • 过滤(使用 BPF 程序)
  • 调试打印输出(使用 bpf_trace_printk())
  • 基于每个事件的输出(使用 bpfperf_event_open())
  • 基础变量(全局和每线程专属变量,通过 BPF 映射表实现)
  • 关联数组(associative array,通过 BPF 映射表实现)
  • 频率统计(通过 BPF 映射表实现)
  • 直方图(支持以 2 的幂为区间,或线性以及自定义区间,通过 BPF 映射表实现)
  • 时间戳和时间差(通过 bpf_ktime_get_ns()和 BPF 程序实现)
  • 调用栈信息,内核态(通过 BPF stackmap 实现)
  • 调用栈信息,用户态(通过 BPF stackmap 实现)
  • 可覆盖的环形缓冲区(通过 perfe_vent_attr.write_backward 实现)
  • 低成本开销的插桩支持(BPFJIT,以及在 BPF 映射表中进行统计)
  • 生产环境安全性(BPF 验证器)

用户态特性

BCC 用户态前端和 BCC 代码仓库中提供了以下用户态的特性。

  • 静态跟踪,用户态(通过 uprobes 实现的 SystemTap 风格的 USDT 探针)
  • 调试打印输出(通过 Python 使用 BPF.trace_pipe()BPF.trace_felds())
  • 基于每个事件的输出(BPFPERFOUTPUT 宏BPF.open_perfbufer())
  • 周期性输出(BPF.get_table()table.clear())
  • 直方图打印(table.print_log2_hist())
  • C 结构体成员访问,内核态(将 BCC 重写器映射到 bpfproberead() 结果上)
  • 内核态的符号解析(ksym()ksymaddr())
  • 用户态的符号解析(usymaddr())
  • 调试信息符号的解析支持
  • BPF 跟踪点支持(TRACEPOINTPROBE)
  • BPF 调用栈回溯支持(BPFSTACK_TRACE)
  • 各种其他辅助宏和函数
  • 示例(在/examples 目录下)
  • 许多工具(在/tools 目录下)
  • 新手指引(在/docs/tutorial*.md 中)
  • 参考手册(在/docs/reference_guide.md 中)

安装 BCC

内核要求

主要的内核 BPF 组件是在内核 4.1 到 4.9 版本之间发布的,推荐使用Linux4.9(发布于2016年12月)或更新的内核版本。

需要开启以下内核配置选项:CONFIG_BPF=y、CONFIG_BPF_SYSCALL=y、CONFIG_BPF_EVENTS=y、CONFIG_ BPF_JIT=y,还有CONFIG_HAVE_EBPF_JIT=y.现在这些选项在很多 Linux 发行版中是默认开启的,所以一般不需要你进行变更。

Ubuntu

包的名字叫作 bpfcc-tools

liruilonger@cloudshell:~$ sudo apt install bpfcc-tools
liruilonger@cloudshell:~$ dpkg -L bpfcc-tools
liruilonger@cloudshell:/usr/sbin$ ls | grep  bpfcc
argdist-bpfcc
bashreadline-bpfcc
bindsnoop-bpfcc
biolatency-bpfcc
biolatpcts-bpfcc
biosnoop-bpfcc
biotop-bpfcc
bitesize-bpfcc
bpflist-bpfcc
btrfsdist-bpfcc
btrfsslower-bpfcc
cachestat-bpfcc
cachetop-bpfcc

RHEL

sudo yum -u install bcc-tools

其他发行版 可以参考 install.md 文件的中的内容

┌──[root@liruilongs.github.io]-[~/bcc] 
└─$cat INSTALL.md

BCC 的工具

在这里插入图片描述

重点工具

  • 调试/多用途: trace(跟踪系统调用或函数执行)argdist(跟踪并统计函数参数的分布情况)funccount(统计函数被调用的次数)stackcount(统计函数调用栈的频次)opensnoop(跟踪进程打开文件)
  • CPU 相关execsnoop(执行新程序的行为)、runglat(测量进程的运行延迟)、runglen(测量进程的运行长度)、 cpudist、profle、ofcputime、syscount、softirq、hardirq
  • 内存相关: memleak(检测内存泄漏)
  • 文件系统相关:opensnoop(跟踪文件打开操作)、flelife(跟踪文件生命周期)、vfsstatt(收集虚拟文件系统统计信息)、fleslower(检测文件系统慢操作)、cachestat/writeback/dcstat(与文件系统缓存和写入操作相关的统计工具)、xfsslower/xfsdist/ext4dist(针对特定文件系统(如XFS、Ext4)的性能分析工具)
  • 磁盘 IO 相关: biolatency(跟踪块I/O操作的延迟)、biosnoop/biotop(跟踪和显示块I/O操作的详细信息)、 bitesize(分析块I/O的大小分布)
  • 网络相关tcpconnect/tcpaccept(跟踪TCP连接和接受事件)、tcplife(跟踪TCP套接字的生命周期)、tcpretrans(分析TCP重传事件)
  • 安全相关capable(检查进程是否具有特定的Linux功能(capabilities))
  • 编程语言相关javastat,javacalls、javathreads、javafow、javagc 针对Java应用程序的性能和调用分析
  • 应用程序相关: mysqld_qslower(针对MySQL数据库的慢查询分析)、signals/killsnoop(跟踪进程信号接收和杀死事件)
  • 内核相关:wakeuptime/offwaketime (分析内核唤醒事件和延迟)

工具的特点

BCC 工具拥有以下共同特点:

  • 它们中的每一个都解决了实际的观测性问题,有其创建的必要性
  • 它们设计为在生产环境中由root用户来使用。
  • 每个工具都有一个对应的man帮助文档(在 man/man8 下)。
  • 每个工具都配备了示例文件,其中有示例输出以及对输出的解释(在 tools/*example.txt 文件中)。
  • 许多工具都接受启动选项和参数,大部分工具在使用-h选项时会打印帮助信息
  • 工具源代码以一段注释作为开始。
  • 工具源代码遵循统一的风格(使用 pep8 工具进行统一检查)。

尽管 BCC 支持不同的语言前端,但 BCC 工具中

  • 用户态组件主要使用 Python 语言完成
  • 内核态 BPF 程序则主要使用 C 语言完成

这些使用 Python/C 语言的工具会得到来自 BCC 项目开发者更多的关注和维护,因此本书也主要介绍它们。

单一用途工具

UNIX的哲学是专注做一件事情,并把它做好(do one thing and do it well)。

换一种说法是:创建小的高质量的工具,使用管道(pipe)将其连接起来以完成更复杂的任务这一传统带来了一批小巧而功能单一的工具并流传至今,比如grep(1)、cut(1)和 sed(1)等。

BCC 包含许多类似的单一功能工具,包括 opensnoop(8)、execsnoop(8)和biolatency(8)。opensnoop(8)是一个很好的例子。参看下面的例子,思考一下对于跟踪 open(2)系列系统调用的这个单一任务来讲,这些选项和输出可以如何自由组合:

liruilonger@cloudshell:~$ sudo opensnoop-bpfcc -h
usage: opensnoop-bpfcc [-h] [-T] [-U] [-x] [-p PID] [-t TID] [--cgroupmap CGROUPMAP] [--mntnsmap MNTNSMAP] [-u UID]
                       [-d DURATION] [-n NAME] [-e] [-f FLAG_FILTER]

Trace open() syscalls

optional arguments:
  -h, --help            show this help message and exit
  -T, --timestamp       include timestamp on output
  -U, --print-uid       print UID column
  -x, --failed          only show failed opens
  -p PID, --pid PID     trace this PID only
  -t TID, --tid TID     trace this TID only
  --cgroupmap CGROUPMAP
                        trace cgroups in this BPF map only
  --mntnsmap MNTNSMAP   trace mount namespaces in this BPF map only
  -u UID, --uid UID     trace this UID only
  -d DURATION, --duration DURATION
                        total duration of trace in seconds
  -n NAME, --name NAME  only print process names containing this name
  -e, --extended_fields
                        show extended fields
  -f FLAG_FILTER, --flag_filter FLAG_FILTER
                        filter on flags argument (e.g., O_WRONLY)

examples:
    ./opensnoop           # trace all open() syscalls
    ./opensnoop -T        # include timestamps
    ./opensnoop -U        # include UID
    ./opensnoop -x        # only show failed opens
    ./opensnoop -p 181    # only trace PID 181
    ./opensnoop -t 123    # only trace TID 123
    ./opensnoop -u 1000   # only trace UID 1000
    ./opensnoop -d 10     # trace for 10 seconds only
    ./opensnoop -n main   # only print process names containing "main"
    ./opensnoop -e        # show extended fields
    ./opensnoop -f O_WRONLY -f O_RDWR  # only print calls for writing
    ./opensnoop --cgroupmap mappath  # only trace cgroups in this BPF map
    ./opensnoop --mntnsmap mappath   # only trace mount namespaces in the map
liruilonger@cloudshell:~$ sudo opensnoop-bpfcc
PID    COMM               FD ERR PATH
10923  entrypoint.sh       3   0 /dev/null
10923  ps                  3   0 /etc/ld.so.cache
10923  ps                  3   0 /lib/x86_64-linux-gnu/libprocps.so.8
10923  ps                  3   0 /lib/x86_64-linux-gnu/libdl.so.2
10923  ps                  3   0 /lib/x86_64-linux-gnu/libc.so.6
10923  ps                  3   0 /usr/lib/x86_64-linux-gnu/libsystemd.so.0
10923  ps                  3   0 /lib/x86_64-linux-gnu/librt.so.1
10923  ps                  3   0 /lib/x86_64-linux-gnu/liblzma.so.5
10923  ps                  3   0 /usr/lib/x86_64-linux-gnu/libzstd.so.1
10923  ps                  3   0 /usr/lib/x86_64-linux-gnu/liblz4.so.1
10923  ps                  3   0 /usr/lib/x86_64-linux-gnu/libgcrypt.so.20
10923  ps                  3   0 /lib/x86_64-linux-gnu/libpthread.so.0
10923  ps                  3   0 /lib/x86_64-linux-gnu/libgpg-error.so.0
10923  ps                  3   0 /proc/self/auxv
10923  ps                  3   0 /proc/sys/kernel/osrelease
10923  ps                  3   0 /sys/devices/system/cpu/online
10923  ps                  3   0 /proc/self/auxv
10923  ps                  3   0 /proc/self/stat
10923  ps                 -1   6 /dev/tty
10923  ps                  3   0 /proc/uptime
10923  ps                  4   0 /proc/sys/kernel/pid_max
10923  ps                  4   0 /proc/sys/kernel/osrelease
10923  ps                  4   0 /proc/meminfo
10923  ps                  5   0 /proc
10923  ps                  6   0 /proc/1/stat

多用途工具

BCC中,最强大的多用途工具是funccount(8)、stackcount(8)、trace(8)以及argdist(8),接下来的部分会对它们进行介绍。这些多用途工具通常需要用户来决定跟踪哪些事件。

不过为了能够享受这种灵活性,用户需要知道使用哪些kprobes、uprobes 以及其他事件等细节–包括如何使用它们。在后续关于特定主题的章节中,还是会回到使用单一用途工具上。

  • funccount: 对事件进行计数,包括函数调用
  • stackcount:对引发某事件的函数调用栈进行计数
  • trace: 定制化打印每个事件的细节信息
  • argdist : 对事件的参数分布进行统计

博文内容整理

© 文中涉及参考链接内容版权归原作者所有,如有侵权请告知 😃


《BPF Performance Tools》


© 2018-2024 liruilonger@gmail.com, All rights reserved. 保持署名-非商用-相同方式共享(CC BY-NC-SA 4.0)

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LeetCode | 1624.两个相同字符之间的最长子字符串

这道题拿到手想法就是去双重遍历暴力解,对于每个字符,从后往前遍历字符串,找到从后往前一直到本次遍历的这个字符串这段子串中和这个字符串相同的字符位置,然后得到子字符串的长度,和ans存储的值做一个比较&#xff0c…

【python】错误SyntaxError: invalid syntax的解决方法总结

解决Python报错:【Python】错误SyntaxError: invalid syntax的解决方法总结 SyntaxError是Python编程中常见的错误之一,它表明代码中有语法错误。这种错误可能由多种原因引起,包括但不限于拼写错误、错误的缩进、缺少括号等。本文将介绍几种常…

【BUG】已解决: No module named ‘torch._six

已解决:No module named ‘torch._six 欢迎来到英杰社区https://bbs.csdn.net/topics/617804998 欢迎来到我的主页,我是博主英杰,211科班出身,就职于医疗科技公司,热衷分享知识,目前是武汉城市开发者社区主…

Python进阶-部署Flask项目(以TensorFlow图像识别项目WSGI方式启动为例)

本文详细介绍了如何通过WSGI方式部署一个基于TensorFlow图像识别的Flask项目。首先简要介绍了Flask框架的基本概念及其特点,其次详细阐述了Flask项目的部署流程,涵盖了服务器环境配置、Flask应用的创建与测试、WSGI服务器的安装与配置等内容。本文旨在帮…

[vulnhub]Lin.Security主机Linux提权

Hash Crack(Hash cat) boblinsecurity:~$ cat /etc/passwd $ echo "AzER3pBZh6WZE">hash 检查哈希类型: $ hash-identifier AzER3pBZh6WZE $ hashcat -m 1500 -a 0 hash /usr/share/wordlists/rockyou.txt --force username:insecurity password:AzER3pBZh6WZE…

大模型PEFT(二) 之 大模型LoRA指令微调学习记录

1.peft 1.1 微调方法批处理大小模式GPU显存速度 1.2 当前高效微调技术存在的一些问题 当前的高效微调技术很难在类似方法之间进行直接比较并评估它们的真实性能,主要的原因如下所示: 参数计算口径不一致:参数计算可以分为三类: 可训练参数的数量、微调模型与原…

406. 根据身高重建队列(中等)

406. 根据身高重建队列 1. 题目描述2.详细题解3.代码实现3.1 Python3.2 Java 1. 题目描述 题目中转:406. 根据身高重建队列 2.详细题解 做一道题之前先静心,默念三遍一切反动派都是纸老虎。已知一个队列,队列中每个数据表示一个属性&#xf…

保利威观看页SDK 官方VUE开源项目 polyv-web-live-watch-sdk

一、安装:node、npm 二、下载源码 polyv-web-live-watch-sdk: 保利威直播观看 SDK 官方文档:保利威帮助中心 进入项目根目录 npm ci #安装依赖,如果 CI 失败,请试一下 npm ci --no-cache --registryhttps://registry.npmmirr…

OpenCV绘制直线

一 绘制图形 画线 画矩形 画圆 画椭圆 画多边形 绘制字体 二 画线 line(img,开始点,结束点,颜色…) 参数结束 img:在那个图像上画线 开始点,结束点:指定线的开始与结束位置; 颜色,线宽,线体…

C++ MPI多进程并发

下载 用法 mpiexec -n 8 $PROCESS_COUNT x64\Debug\$TARGET.exe 多进程并发启动 mpiexec -f hosts.txt -n 3 $PROCESS_COUNT x64\Debug\$TARGET.exe 联机并发进程,其它联机电脑需在相同路径下有所有程序 //hosts.txt 192.168.86.16 192.168.86.123 192.168…

1025 反转链表

solution 模拟链表&#xff1a;记录链表中第i个元素的地址&#xff0c;再记录每个给定地址的对应数据和下一结点地址。注意给出的结点可能有的无效 #include<iostream> #include<algorithm> using namespace std; const int maxn 1e5 10; int main(){int n, k,…

云服务器Ubuntu系统的vim-plus(youcompleteme)完整安装

一. 安装vim-plus PS&#xff1a;需要在那个用户下配置vim-plus&#xff0c;就到那个用户下执行代码 git clone https://github.com/chxuan/vimplus.git ~/.vimplus cd ~/.vimplus ./install.sh二. 解决没有代码自动补全的问题 随便创建一个Test.cpp文件&#xff0c;vim打开…

【电机控制】FOC算法验证步骤

【电机控制】FOC算法验证步骤 文章目录 前言一、PWM——不接电机1、PWMA-H-50%2、PWMB-H-25%3、PWMC-H-0%4、PWMA-L-50%5、PWMB-L-75%6、PWMC-L-100% 二、ADC——不接电机1.电流零点稳定性、ADC读取的OFFSET2.电流钳准备3.运放电路分析1.电路OFFSET2.AOP3.采样电路的采样值范围…

跑滴滴能赚多少?

今天看到一个帖子。 35岁&#xff0c;已经失业3个月了。现在重新考虑工作的方式和意义。正在经历中年人的危机&#xff0c;是继续像之前那样工作&#xff0c;还是重新开启一段新的工作方式&#xff1f;这个问题一直在我脑海中盘旋。 工作的目的就是赚钱。只要能找到赚钱的方式&…

Flutter项目开发模版,开箱即用

前言 当前案例 Flutter SDK版本&#xff1a;3.22.2 每当我们开始一个新项目&#xff0c;都会 引入常用库、封装工具类&#xff0c;配置环境等等&#xff0c;我参考了一些文档&#xff0c;将这些内容整合、简单修改、二次封装&#xff0c;得到了一个开箱即用的Flutter开发模版…

基于STM32开发的智能语音助理系统

⬇帮大家整理了单片机的资料 包括stm32的项目合集【源码开发文档】 点击下方蓝字即可领取&#xff0c;感谢支持&#xff01;⬇ 点击领取更多嵌入式详细资料 问题讨论&#xff0c;stm32的资料领取可以私信&#xff01; 目录 引言环境准备智能语音助理系统基础代码实现&#xff…

《python程序语言设计》2018版第5章第47题绘制随机球,在一个宽120高100的矩形里绘制随机的点

这个题其实并不难。 首先我们利用turtle功能绘制一个矩形&#xff0c;圆心点题里要求的是0&#xff0c;0 这个好办 然后我们根据宽120&#xff0c;高100计算一下。肯定是正负两个值参与其中。 坐标点如下 建立矩形代码如下 turtle.penup() turtle.goto(-60, 50) turtle.pend…

HQChart小程序教程4-动态控制手势滚动页面

动态控制手势滚动页面 示例效果canvas 控制页面滚动属性步骤1. 使用变量绑定disable-scroll2. 在手势处理函数中控制是否滚动页面 交流QQ群HQChart代码地址 示例效果 canvas 控制页面滚动属性 根据官方文档&#xff0c;disable-scroll 属性是控制画布手势是否可以滚动页面。 h…

解读下/etc/network/interfaces配置文件

/etc/network/interfaces 是一个常见的网络配置文件&#xff0c;通常在 Debian 及其衍生版本的 Linux 发行版中使用。该文件用于配置网络接口和网络连接参数&#xff0c;允许用户手动设置网络连接的属性&#xff0c;包括 IP 地址、子网掩码、网关、DNS 服务器等。 以下是一个可…

领导者在沟通中最容易犯的错误

本文讨论了领导者在沟通过程中如何避免成为传声筒&#xff0c;通过筛选、处理和总结信息&#xff0c;在向上、向下沟通时保持相关性和真实性&#xff0c;提高沟通效率和效果。原文: The Dumbest Mistake Leaders Make in Communication 中层管理者作为高层领导、下属团队和其他…