首页 > 其他分享 >BPF的简单学习

BPF的简单学习

时间:2023-01-27 13:22:06浏览次数:35  
标签:kernel bpf BPF bcc 学习 内核 简单 工具

BPF的简单学习


前言

本来规划过年期间学习一下bpf相关的内容
但是因为自己没有坚持学习,所以到最后一天才开始整理.
本来想深入学习一下相关内容,但是已经感觉已经无法完成.
最近大半年进行了很多性能诊断分析的工作,很多时候感觉已经到达瓶颈.
感觉必须要深入到内核,深入到指令运行周期才可以有所提升. 
基于此,本次简单记录一下这些地方.可能不是很对. 希望自己能够慢慢完善.

摘要

1. 概念
2. 发展历史
3. 部分简单使用.
4. 学习的目标和方向

概念和发展历史

bpf 是 柏克利包过滤器
Berkeley packet fliter
他出现的年份非常早,跟linux的诞生基本同期
最早出现于1992年的论文,这篇论文主要提出一种新的网络数据包的过滤的框架
最开始bpf的目标主要是进行网络报的过滤
但是随着技术的发展,bpf有了更深入的发展可以实现更多的功能比如
2013年有人对bpf进行了彻底的改造,可以增加:安全,网络,甚至是基于内核的编程等特性.

因为有这个比较大的区别所以,之前仅用于网络报过滤的称之为 cbpf classic bpf 
最新的改进则称之为 ebpf extend bpf 

区别

第一: 
cBPF支持的功能比较单一,只能够作用于网络的数据包的过滤上。
eBPF不仅支持网络的数据包的过滤上,也支持其他的事件类型,
如XDP、Perf Event、kprobe、tracepoint等等。
cBPF的功能在eBPF其实对应的就是Socket的部分。
第二: 
引入Map机制。在cBPF我们通过接收队列将过滤后数据获取出来,
但是在eBPF我们可以将数据放到Map空间中。
Map空间是用户空间和内核空间共享的,
所以一般是在内核中将数据存入到Map空间中,然后在用户空间取出数据。
第三: 
指令集变得更复杂了,与此同时,有了专门的用于编译BPF字节码的编译器clang/llvm。
第四:
还有在安全机制方面等等一些改变

工具的变迁

在cbpf的时代,一般就是tcpdump或者是wireshark等的抓包工具进行使用.
在ebpf的时代,更多的性能侦测,以及kernel的hook的实现,有了更深刻的用户.
最开始ebpf 有一套 bcc 工具 bpf complie collection 的工具组合. 
但是因为较为复杂和难学:
需要安装定制的包, 并且需要使用一些C或者是C++的语言进行编写. 
最近几年尤其是内核进入5.0和6.0的时代.
增加了libbpf工具包以及实现了 CO-RE的机制, 使得ebpf的工具链有了更大的发挥余地
Complie Once - Run Everywhere
这些工具可以使用python后者是go等语言进行编写工具链. 

简单学习bcc

注意 因为需要比较高的内核版本,所以本次选用 OpenEuler 22.03 
内核版本为:
Linux openeuler2203 5.10.0-60.18.0.50.oe2203.x86_64 
#1 SMP Wed Mar 30 03:12:24 UTC 2022 x86_64 x86_64 x86_64 GNU/Linux

安装bcc工具链
yum install bcc kernel-devel kernel-headers  -y 
mkdir -p /bcc && cd /bcc 

注意安装完之后会在 /usr/share/bcc/tools/ 目录下面有很多工具
可以执行里面的工具进行处理. 

比如 ./filetop

但是这边总是报错 未解决.

modprobe: FATAL: Module kheaders not found in directory /lib/modules/5.10.0-60.18.0.50.oe2203.x86_64
Unable to find kernel headers. Try rebuilding kernel with CONFIG_IKHEADERS=m (module) or installing the kernel development package for your running kernel version.
<built-in>:1:10: fatal error: './include/linux/kconfig.h' file not found
#include "./include/linux/kconfig.h"
         ^~~~~~~~~~~~~~~~~~~~~~~~~~~
1 error generated.
Traceback (most recent call last):
  File "/usr/share/bcc/tools/./filetop", line 164, in <module>
    b = BPF(text=bpf_text)
  File "/usr/lib/python3.9/site-packages/bpfcc/__init__.py", line 479, in __init__
    raise Exception("Failed to compile BPF module %s" % (src_file or "<text>"))
Exception: Failed to compile BPF module <text>

学习的目标和方向

结合火焰图
结合进程的相关信息
linux 内核的知识 完善自己的调优技术链..

标签:kernel,bpf,BPF,bcc,学习,内核,简单,工具
From: https://www.cnblogs.com/jinanxiaolaohu/p/17068833.html

相关文章

  • 应急响应知识学习1
    一、系统排查阶段查看window用户信息一般用netuser命令,但是这个命令查看不出来隐藏的用户,查看隐藏用户可以在计算机管理-本地用户和组里面进行查看也可以用注册......
  • 树形结构学习笔记
    线段树引入假设有这样的问题:有\(n\)个数,\(m\)次操作,操作分为:修改某一个数或者查询一段区间的值。分析下,如果针对数组元素的修改可以是\(O(1)\)完成,求某个区间值需......
  • C语言实现一个简单的单向链表list
    C语言实现一个简单的单向链表listcheungmine用C语言实现一个简单实用的单向链表list,具有一定的实际意义。尤其我们不想使用STL里面的list<...>类的时候。我实现的这个list,结......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实现......
  • Windows下安装Miniconda及配置和简单使用
    一、下载Miniconda根据自己的需求下载Anaconda或者Miniconda。我这里选择轻量化的Miniconda。二、安装Miniconda根据安装程序提示,一直点击下一步即可。三、在......
  • 自从学习了MongoDB高可用,慢慢的喜欢上了它,之前确实冷落了
    大家好,我是哪吒,最近项目在使用MongoDB作为图片和文档的存储数据库,为啥不直接存MySQL里,还要搭个MongoDB集群,麻不麻烦?让我们一起,一探究竟,继续学习MongoDB高可用和片键策略,实......
  • 学习笔记——redis中的数据类型(List、Set、Hash)
    2023-01-25一、redis中的数据类型1、redis列表(List)redis列表底层是一个双向链表。(1)从左边/右边插入一个或多个值lpush/rpush<key><value1><value2><value3>例如:......
  • 《RPC实战与核心原理》学习笔记Day10
    11|负载均衡:节点负载差距这么大,为什么收到的流量还一样?什么是负载均衡?当我们的一个服务节点无法支撑现有的访问量时,我们会部署多个节点,组成一个集群,然后通过负载均衡,......
  • 【学习笔记】组合数学学习笔记
    参考资料:《组合数学》,OI-Wiki排列组合四个计数原理加法原理:并列的方案数加和。乘法原理:叠加的方案数相乘。减法原理:正难则反,补集转换。除法原理:目测用处不大......
  • 学习Ucore_lab体会
    纸上得来终觉浅,觉知此事要躬行使能中断物理内存管理虚拟内存管理内核线程管理用户进程管理进程调度同步和互斥文件系统 这些实验的名字都会让我心动。学习uc......