BPF技术学习与整理

news2024/9/21 10:50:43

目录

  • eBPF是什么?
  • eBPF是做什么的?可以解决什么问题?
  • eBPF可以带来的解决方案是什么?
  • eBPF的技术点
    • eBPF hook
    • eBPF Map
    • eBPF Helper Function
  • eBPF有什么限制吗?


前言

21年因为项目需求而要开发一个工具,可以满足:故障排查,问题分析,统计数据等需要。开始实现的比较简单,就是针对抓取的log数据进行各个维测数据的解析和处理。具有如下几种缺陷:

1、log内容主要还是借助于简单的printf和printk的内容,这类打印信息量不足。主要是release的版本不可能有太多此类的信息,否则会严重影响系统的性能。

2、信息量少也意味着无法有效支撑问题问题的相关信息追溯,无法进行有效的数据统计。因此很多监控和买点方案就无法有效实现。

3、无法将工具有效整合到整个软件开发工程中去。所以无法得到各个方面的资源支撑。所以工具必然不能得到很好地推广而进行迭代优化。

后来发现eBPF技术能够很好地满足需求。因此开始接触了eBPF技术。趁着这段时间,准备针对这个技术做一个比较完整的学习和梳理记录。

1、eBPF是什么?

BPF:Berkeley Packet Filter,伯克利包过滤器

发明之初是一款网络过滤神器,tcpdump就是基于这个神器的神器

eBPF:extended Berkeley Packet Filter 扩展的伯克利包过滤器

演进成一套通用执行引擎,不再仅仅是网络分析,可以基于eBPF开发

性能分析,系统跟踪,网络优化等多种类型的工具平台。

原来的BPF被称为cBPF(classic BPF),当前Linux内核只运行eBPF,内核将会透明地转换成eBPF再执行

BPF再数据包过滤山引入了两大革新:
  1. 1)一个新的虚拟机设计,有效地工作再基于寄存器的CPU之上,基于栈的虚拟机和基于寄存器的虚拟机区别-CSDN博客

2)应用程序使用缓存只复制顾虑数据包相关的数据,不会复制数据包的所有信息,最大程度地减少处理的的数据,提高处理效率

eBPF目前发展成为一套通用的执行引擎,提供可基于系统或程序事件高效安全执行特定代码的通用能力,通用能力的使用者不再局限内核开发者。使用场景也不仅仅是网络分析。可以基于eBPF开发性能分析,系统追踪,网络优化等多种类型的工具和平台。

eBPF由执行字节码指令,存储对象和辅助函数组成。工作原理如下:

eBPF字节码指令在内核执行前必须通过BPF验证器的验证,同时在启用BPF JIT模式的内核中,会直接将指令转成内核可执行的本地指令运行,具有很搞笑的执行效率。

 

2、BPF是做什么的?可以解决什么问题?

1)linux内核开发目标:强安全,高性能,持续交付

强安全:就是不能允许不可信的代码运行在内核中。

高性能:作为承载千百服务的操作系统内核,需要有高性能的保障应用的快速发展需求。

持续交付:就是不断升级迭代更新。同时,升级动作本身对于用户而言尽量不会感知到。

2)linux内核开发的一般解决方案和缺陷

直接修改内核代码,通过API暴露能力,用户可能要等上n年才能更新到这个版本来使用。而且每次的功能更新都可能需要重新编译打包内核代码

开发新的可即时加载的内核模块,这个内核模块可能会随着每一个内核版本的发布而不可用了,因此你必须小心地为每一次的内核版本更新调整模块代码。不然就会让内核模块直接崩溃

3、BPF可以带来的解决方案是什么?

强安全:BPF验证器(verifier)通过沙盒机制检查每一个程序是否能够安全运行在内核中,拒绝不安全的代码。

高性能:JIT编译保障了程序本地运行的高性能

持续交付:程序可以被无缝替换,并不影响在运行的任务。

强安全:就是在检查不通过的,将拒绝这个程序被加载到内核中去,从而保证内核本身不会崩溃,有一个验证器进行验证这是不同于内核模块的。比如以下几种情况就是无法通过BPF验证器的:

没有实际加载BPF程序所需的权限的

访问任意内核空间内存数据的

将任意内核空间内存数据暴露给用户空间的

高性能:通过安全验证后,JIT编译生成的是通用字节码,它是完全可移植的,可以在任意CPU架构山加载这个字节码的。这样我们能获得本地编译后的程序运行速度了。

持续交付:通过了JIT编译后,就会把编译后的程序附加到各种系统调用的钩子(hook)上,而且可以在不影响系统运行的情况下,实时地在线地替换掉这些运行在Linux内核中的BPF程序。

4、eBPF的技术点

BPF钩子(hooks)

能够加快BPF程序的地方:

1)kenrel functions(kprobes)

2)userspace functions(uprobes)

3)system calls

4)fentry

5)fexit

6)Tracepoints

7)network devices(tc/xdp)

8)network routes

9)TCP congestion algorithms

10)sockets(data level)

这10种钩子就是内核中可以加载BPF程序的地方。

包括:文件打开,创建TCP链接,Socket链接到发送系统消息等几乎所有的系统调用。用户空间的各种动态信息都能加载BPF程序。

BPF Map:

BPF Map,存储数据,交换信息的桥梁

Map的类型:Hash tables,Arrays,LRU(Least Recently Used),Ring Buffer,Stack Trace,LPM(Longest Prefix match)

Map的功能:Program state,Program configuration,Share data between programs,share state,metrics,and statistics with user space

对于一个程序通常复杂的逻辑就必须要记录数据的状态的部分。BPF Map就是用来存储数据的状态信息,统计信息和指标信息的。

BPF Map是可以被用户空间访问并操作的

BPF Map是可以与BPF程序分离的,即当创建一个BPF Map的BPF程序运行结束后,该BPF Map还能存在,而不是随着程序一起消亡的。

基于上面的特点,我们可以利用BPF Map持久化数据,在不丢失重要数据的同时,更新BPF程序逻辑,实现在不同程序之间共享信息,在收集统计信息或指标等场景下,非常有用

BPF Helper Function:BPF的辅助函数

辅助函数的清单:

Random numbers

Get current time

Map access

Get process/cgroup context

Manipulate network packets and forwarding

Access socket data

Perform tail call

Access process stack

Access syscall arguments

它们是面向开发者的,提供操作BPF程序和BPF Map的工具类函数。就是一个中间件。适配内核的迭代更新,主要是内核函数的变化,而对开发者是透明的,形成稳定的API接口。

例如:BPF程序需要生成一个随机数,那么有一个辅助函数可以帮助检索并询问内核,让内核完成“给我一个随机数”的任务,或者“从BPF Map中读取某个值”等等。

只要与操作系统内核的交互都是通过BPF辅助函数来完成的,由于这些都是稳定的API,所以BPF程序可以跨内核版本进行移植。

eBPF技术有些什么限制?

eBPF程序不能调用任意的内核参数,只限于内核模块中列出的BPF Helper函数,函数支持列表也随着内核演进而不断增加

eBPF程序不允许包含无法达到的指令,防止加载无效代码,延迟程序的终止。

eBPF程序中循环次数限制且必须在有限时间内结束

eBPF堆栈大小被限制在MAXBPFSTACK。Linux5.8,被设置为512。可以改用BPF Map,大小是无限的。

eBPF字节码大小最初被限制在4096条指令,Linux5.8版本,已放宽至100万条指令(BPF_COMPLEXITY_LIMIT_INSNS),对于无权限的BPF程序,仍然保留4096条的限制(BPF_MAXINSNS)


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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何通过docker启动一个本地springboot的jar包

一、构建本地jar包 进入到项目目录下执行如下命令 mvn -e clean package -Dmaven.test.skiptrue或者直接在idea中打包 得到target文件夹 进入到target文件夹得到jar包 二、创建Dockerfile文件 新建Dockerfile文件,内容如下 FROM openjdk:8-jre MAINTAINER ja…

硬盘坏掉之后

文章目录 背景解决方案数据丢失软件安装 总结 背景 前一段时间,我的电脑突然就开不了机了,进入安全模式之后,发现硬盘无法读取,大概率是硬盘坏掉了。电脑是 MacBook,自己不太好换。于是跑到华强北,找了一家…

电脑无论是连接热点,还是公共网络,qq、微信都能用,就是不能上网,现分享解决办法如下。

这里写自定义目录标题 问题引入:解决办法1、打开电脑的控制面板2、点击 “网络和internet”3、点击 “internet 选项”4、点击 “连接”5、点击 “局域网设置”6、按照下面操作 问题引入: 在魔法使用网站之后,忘记关闭 clash 按钮就关闭电脑&…

Spring-学习修改尚硅谷最新教程笔记

二、Spring 1、Spring简介 1.1、Spring概述 官网地址:https://spring.io/ Spring 是最受欢迎的企业级 Java 应用程序开发框架,数以百万的来自世界各地的开发人员使用 Spring 框架来创建性能好、易于测试、可重用的代码。 Spring 框架是一个开源的 Jav…

数据湖Iceberg-SparkSQL集成(4)

文章目录 数据湖Iceberg-SparkSQL集成一、环境准备安装Spark 二、Spark配置Catalog2.1在配置文件中添加HiveCatalog与HadoopCatalog配置(一劳永逸)2.2使用spark-sql连接Hive Catalog2.3使用spark-sql连接Hadoop Catalog 三、SQL操作3.1 创建表创建分区表…

一个 24 通道 100Msps 逻辑分析仪

这是一个创建非常便宜的逻辑分析仪的项目,但其功能可与昂贵的商业分析仪相媲美。该分析仪可以以每秒 1 亿个样本的最高速度对多达 24 个通道进行采样,并且可以通过单个通道中的极性变化或多达 16 个通道形成的模式来触发。 该项目不仅包含硬件&#xff0…

去银行还是干嵌入式?

晚上要睡觉的时候,一个读者给我发消息 说是最近拿到了4个offer,现在犹豫不决 听说,最近嵌入式突然就火起来了。 不过,嵌入式很多人的薪资还是低了,而且,工作很多年后,嵌入式的工作,那…

蛋白冠™蛋白质组学技术实现快速深入精确地解析血浆蛋白质图谱

文章标题:Rapid, deep and precise profiling of the plasma proteome with multi-nanoparticle protein corona 发表期刊:Nature Communications 影响因子:17.694 作者单位:哈佛医学院;Seer,美国&#…

opencv (六十四)监督学习聚类(k近邻原理、支持向量机原理、k近邻(KNN)手写字识别、支持向量机数据分类)

文章目录 1 k近邻原理介绍2 支持向量机原理3 K近邻(KNN)手写字识别训练模型4 手写字识别5 支持向量机 进行数据分类6 源代码及数据文件下载1 k近邻原理介绍 k最近邻(k-Nearest Neighbor)算法是比较简单的机器学习算法。它采用测量不同特征值之间的距离方法进行分类。它的思想…

算法刷题知识点总结

因为数组的在内存空间的地址是连续的,所以我们在删除或者增添元素的时候,就难免要移动其他元素的地址。 二分法:采用两个指针,注意他们的区间划分; 双指针法,用于查找排序:双指针将一个两层循…

BUUCTF warmup_csaw_2016

小白垃圾做题笔记而已,不建议阅读。 唉,本来以为是让写shellcode的打了半天没打通,后来发现疏忽了sub_40060D函数。 前两行(6,7)没啥就是把那个字符串写到屏幕上。 然后是第八行, sprintf(): 这个函数用于将格式化的字符串写入…

Linux安装MongoDB数据库,实现外网远程连接访问

文章目录 1. 配置Mongodb源2. 安装MongoDB3. 局域网连接测试4. 安装cpolar内网穿透5. 配置公网访问地址6. 公网远程连接7. 固定连接公网地址8. 使用固定地址连接 简单几步实现Linux安装mongoDB数据库并且结合cpolar内网穿透实现在公网环境下的远程连接。 1. 配置Mongodb源 进…

聊聊开源类ChatGPT工作——MOSS

自从ChatGPT发布以来,它的“三步走方案”就好比《九阴真经》流落到AI江湖中,各大门派练法不一,有人像郭靖一样正着练,循序渐进;有人像欧阳锋一样反着练,守正出奇;也有像梅超风一样仅练就半部《九…

5、认真学习枚举类型

1、数字枚举 // 这里你的TSLint可能会报一个:枚举声明只能与命名空间或其他枚举声明合并。这样的错误,这个不影响编译 enum Status {Uploading,Success,Failed } console.log(Status.Uploading); // 0 console.log(Status["Success"]); // 1 …

智能骨传导蓝牙耳机该如何选,分享几款不错的骨传导蓝牙耳机

骨传导耳机是一种通过骨骼传递声音的耳机。相比于传统的耳塞和头戴式耳机,它有许多优点,例如: 1.安全。因为无需通过耳膜进行声音传递,所以对听力影响较小。 2.对耳朵没有伤害。 3.舒适。 4.节省时间。由于无需通过耳膜传递声音&a…

Codefi基于区块链的开发框架

💗wei_shuo的个人主页 💫wei_shuo的学习社区 🌐Hello World ! Codefi基于区块链的开发框架 Codefi技术是一种基于区块链的开发框架,它提供了一系列工具和服务,帮助开发者轻松构建和管理去中心化应用程序。C…

【Access】win 10 / win 11:Access 下载、安装、使用教程(「管理信息系统」实践专用软件)

目录 一、前言 二、卸载 Office 三、下载 Office Tool Plus 四、安装 Office(内含 Access) (1)启动 Office Tool Plus (2)部署 (3)安装 Office(内含 Access&#…

C++STL详解(10) -- 使用哈希表封装unordered_set和unordered_map

文章目录 哈希表模板参数改造针对模板参数V改造增加仿函数获取具体数据类型. 哈希表的正向迭代器正向迭代器中的内置成员:正向迭代器的成员函数 哈希表插入函数的修改(适用于unordered_map)一个类型K去做set和unordered_set他的模板参数的必备条件.unordered_set的模拟实现(完整…

看完这篇文章你就彻底懂啦{保姆级讲解}-----(LeetCode刷题242有效的字母异位词) 2023.4.25

目录 前言算法题(LeetCode刷题242有效的字母异位词)—(保姆级别讲解)分析题目:有效的字母异位词代码:算法思想: 结束语 前言 本文章一部分内容参考于《代码随想录》----如有侵权请联系作者删除…

详解js跨页面传参以及API的解释

详解js跨页面传参 前言什么是跨页面传参?跨页面传参本质是什么?常见的跨页面传参方法URL参数传递localStorage和sessionStorage参数传递Cookie传递 经常听到API,那么到底的什么是API? 前几天有粉丝私信我,希望能把js跨…