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 内核的知识 完善自己的调优技术链..

BPF的简单学习的更多相关文章

  1. Log4j简单学习笔记

    log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...

  2. shiro简单学习的简单总结

    权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...

  3. CentOS 简单学习 firewalld的使用

    1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...

  4. Windows 下 Docker 的简单学习使用过程之一 dockertoolbox

    1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...

  5. 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习

    嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...

  6. Linux——帮助命令简单学习笔记

    Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...

  7. OI数学 简单学习笔记

    基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...

  8. mongodb,redis简单学习

     2.mongodb安装配置简单学习                   配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作                 ...

  9. html css的简单学习(三)

    html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...

  10. html css的简单学习(二)

    html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...

随机推荐

  1. 经典永流传,华为云媒体 AI 让老电影焕发新生

    摘要:近日,在华为云TechWave全球技术峰会(人工智能&数据)上,马栏山视频文创产业园首席专家周苏岳受邀发表演讲<经典永流传,媒体 AI 让老电影焕发新生>,分享与华为云原生媒 ...

  2. CompletableFuture 使用

    Future的局限性,它没法直接对多个任务进行链式.组合等处理,而CompletableFuture是对Future的扩展和增强.CompletableFuture实现了Future接口,并在此基础上 ...

  3. 手把手教你搭建深度学习开发环境(Tensorflow)

    前段时间在阿里云买了一台服务器,准备部署网站,近期想玩一些深度学习项目,正好拿来用.TensorFlow官网的安装仅提及Ubuntu,但我的ECS操作系统是 CentOS 7.6 64位,搭建Pyth ...

  4. node-sass安装失败问题

    在node 中安装sass依赖总会出现各种各样的问题,第一次遇见这样的问题 Cached binary found at C:\Users\ltzhouhuan\AppData\Roaming\npm ...

  5. lin UI微信小程序组件库

    https://doc.mini.talelin.com/start/ 所在文件夹,npm init 安装组件库, npm i lin-ui@0.8.7 选择"工具-构建npm".

  6. java进阶(12)--8种数据包装类型、Integer、常用方法

    一.基本数据类型与包装类型 8种基本数据类型,对应的包装类,父类 1.byte-->java.lang.Byte-->Number 2.short-->java.lang.Short ...

  7. kafka 在 zookeeper 中保存的数据内容

    转载请注明出处: 1. 服务器上下载 kafka : wget https://archive.apache.org/dist/kafka/2.4.0/kafka_2.12-3.2.0.tgz 2.  ...

  8. Skywalking 的使用

    本文为博主原创,未经允许不得转载: 官网:http://skywalking.apache.org/下载:http://skywalking.apache.org/downloads/Github:h ...

  9. Spring cloud gateWay 限流器限流(一)

    转载请注明出处: spring cloud 提供了限流操作的功能,其使用步骤如下: 1.引入maven依赖: <dependency> <groupId>org.springf ...

  10. # Linux操作补充

    取消高亮显示空格和Tab gvim ~/.vimrc # 在.vimrc文件中 set nohls # shell中执行 source ~/.vimrc ./vimrc是Gvim的配置文件 Gvim新 ...