BPF的简单学习
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的简单学习的更多相关文章
- Log4j简单学习笔记
log4j结构图: 结构图展现出了log4j的主结构.logger:表示记录器,即数据来源:appender:输出源,即输出方式(如:控制台.文件...)layout:输出布局 Logger机滤器:常 ...
- shiro简单学习的简单总结
权限和我有很大渊源. 培训时候的最后一个项目是OA,权限那块却不知如何入手,最后以不是我写的那个模块应付面试. 最开始的是使用session装载用户登录信息,使用简单权限拦截器做到权限控制,利用资源文 ...
- CentOS 简单学习 firewalld的使用
1. centos7 开始 使用firewalld 代替了 iptables 命令工具为 firewall-cmd 帮助信息非常长,简单放到文末 2. 简单使用 首先开启 httpd 一般都自带安装了 ...
- Windows 下 Docker 的简单学习使用过程之一 dockertoolbox
1. Windows 下面运行 Docker 的两个主要工具1): Docker for Windows2): DockerToolbox区别:Docker For Windows 可以理解为是新一代 ...
- 在MVC中实现和网站不同服务器的批量文件下载以及NPOI下载数据到Excel的简单学习
嘿嘿,我来啦,最近忙啦几天,使用MVC把应该实现的一些功能实现了,说起来做项目,实属感觉蛮好的,即可以学习新的东西,又可以增加自己之前知道的知识的巩固,不得不说是双丰收啊,其实这周来就开始面对下载在挣 ...
- Linux——帮助命令简单学习笔记
Linux帮助命令简单学习笔记: 一: 命令名称:man 命令英文原意:manual 命令所在路径:/usr/bin/man 执行权限:所有用户 语法:man [命令或配置文件] 功能描述:获得帮助信 ...
- OI数学 简单学习笔记
基本上只是整理了一下框架,具体的学习给出了个人认为比较好的博客的链接. PART1 数论部分 最大公约数 对于正整数x,y,最大的能同时整除它们的数称为最大公约数 常用的:\(lcm(x,y)=xy\ ...
- mongodb,redis简单学习
2.mongodb安装配置简单学习 配置好数据库路径就可以mongo命令执行交互操作了:先将服务器开起来:在开个cmd执行交互操作 ...
- html css的简单学习(三)
html css的简单学习(三) 前端开发工具:Dreamweaver.Hbuilder.WebStorm.Sublime.PhpStorm...=========================== ...
- html css的简单学习(二)
html css的简单学习(二) <!Doctype html>告诉浏览器,这是一个html文档.lang="en" 默认是en,表示英语:zh-Hans 中文简体:z ...
随机推荐
- 【昇腾】ModelArts与Atlas 200 DK云端协同开发——行人检测Demo(完整版)
摘要:本文主要为大家展示如何基于ModelArts与Atlas 200 DK 端云协同开发的行人检测Demo实现过程. 基于开源数据集,使用ModelArts训练行人检测模型,在本地MindStudi ...
- 数据安全无小事:揭秘华为云GaussDB(openGauss)全密态数据库
摘要:全密态数据库,专门处理密文数据的数据库系统,数据以加密形态存储在数据库服务器中,数据库支持对密文数据的检索与计算. 1.云数据库安全现状及问题 伴随着云基础设施的快速增长和成熟,与之对应的云数据 ...
- 撬动百亿VRAR产业,让VR们“造”起来
摘要:四大亮点抢先看,12月28-29日不见不散! 随着5G商用的加速及元宇宙.数字人等概念的兴起,虚拟现实技术作为未来世界的入口,正受到越来越多的关注,也将成为驱动数字经济发展和产业转型升级的关键技 ...
- 数据丢失不用怕,火山引擎 DataLeap 提供排查解决方案
更多技术交流.求职机会,欢迎关注字节跳动数据平台微信公众号,回复[1]进入官方交流群 当一家公司的日均处理的数据流量在 PB 级别时,巨大的任务量和数据量会对消息队列(MQ)dump 的稳定性和准确定 ...
- 页面滚动,打包,appium工具
''' 移动到元素element对象的"底端",与当前窗口的"底部"对齐: 我们需要将页面下拉一个滑轮 ''' for y in range(3): js = ...
- selenium多标签,多表单切换
Selenium多标签之间的切换 多标签之间的切换 有的时候点击一个链接,新页面并非由当前页面跳转过去,而是新打开一个页面打开,这种情况下,计算机需要识别多标签或窗口的情况 获取所有窗口的句柄 han ...
- Django中安装websocket
完整代码: https://gitee.com/mom925/django-system项目结构: 先安装所需库: pip install channels下面将websocket作为插件一样的只需要 ...
- 【mongodb】pymongo使用
pymongo基本使用 import pymongo from bson.objectid import ObjectId # 连接方式1 client = pymongo.MongoClient(h ...
- 【django-vue】课程表数据录入 课程分类接口 所有课程接口 课程详情接口 所有章节接口 课程列表前端 课程详情前端
目录 上节回顾 APSchudler 双写一致性 今日内容 1 课程表数据录入 2 课程分类接口 2.1 路由 2.2 序列化类 2.3 视图类 3 所有课程接口(过滤,排序) 3.1 表模型 3.2 ...
- GIL 锁或将在 CPython 中成为可选项
哈喽大家好,我是咸鱼 几天前有媒体报道称,经过多次辩论,Python 指导委员会打算批准通过 PEP 703 提案,让 GIL(全局解释器)锁在 CPython 中成为一个可选项 PEP 703 提案 ...