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. 【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(完整版)

    摘要:本文主要为大家展示如何基于ModelArts与Atlas 200 DK 端云协同开发的行人检测Demo实现过程. 基于开源数据集,使用ModelArts训练行人检测模型,在本地MindStudi ...

  2. 数据安全无小事:揭秘华为云GaussDB(openGauss)全密态数据库

    摘要:全密态数据库,专门处理密文数据的数据库系统,数据以加密形态存储在数据库服务器中,数据库支持对密文数据的检索与计算. 1.云数据库安全现状及问题 伴随着云基础设施的快速增长和成熟,与之对应的云数据 ...

  3. 撬动百亿VRAR产业,让VR们“造”起来

    摘要:四大亮点抢先看,12月28-29日不见不散! 随着5G商用的加速及元宇宙.数字人等概念的兴起,虚拟现实技术作为未来世界的入口,正受到越来越多的关注,也将成为驱动数字经济发展和产业转型升级的关键技 ...

  4. 数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案

    更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当一家公司的日均处理的数据流量在 PB 级别时,巨大的任务量和数据量会对消息队列(MQ)dump 的稳定性和准确定 ...

  5. 页面滚动,打包,appium工具

    ''' 移动到元素element对象的"底端",与当前窗口的"底部"对齐: 我们需要将页面下拉一个滑轮 ''' for y in range(3): js = ...

  6. selenium多标签,多表单切换

    Selenium多标签之间的切换 多标签之间的切换 有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新打开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况 获取所有窗口的句柄 han ...

  7. Django中安装websocket

    完整代码: https://gitee.com/mom925/django-system项目结构: 先安装所需库: pip install channels下面将websocket作为插件一样的只需要 ...

  8. 【mongodb】pymongo使用

    pymongo基本使用 import pymongo from bson.objectid import ObjectId # 连接方式1 client = pymongo.MongoClient(h ...

  9. 【django-vue】课程表数据录入 课程分类接口 所有课程接口 课程详情接口 所有章节接口 课程列表前端 课程详情前端

    目录 上节回顾 APSchudler 双写一致性 今日内容 1 课程表数据录入 2 课程分类接口 2.1 路由 2.2 序列化类 2.3 视图类 3 所有课程接口(过滤,排序) 3.1 表模型 3.2 ...

  10. GIL 锁或将在 CPython 中成为可选项

    哈喽大家好,我是咸鱼 几天前有媒体报道称,经过多次辩论,Python 指导委员会打算批准通过 PEP 703 提案,让 GIL(全局解释器)锁在 CPython 中成为一个可选项 PEP 703 提案 ...