BPF技术学习与整理

news/2024/4/20 2:55:17/文章来源:https://blog.csdn.net/haigand/article/details/130345804

目录

  • 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.luyixian.cn/news_show_103307.aspx

如若内容造成侵权/违法违规/事实不符,请联系dt猫网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

每日一个小技巧:1招教你wav格式如何转换mp3

wav是一种质量较高的音频格式,但它的文件大小通常比较大。为了更方便地分享和存储音频文件,许多人都会选择将其转换为mp3格式。因为mp3格式能够在保持较高音质的同时,尽量降低文件大小,帮助你节省许多磁盘空间。那你们知道wav格式…

Java基础——多线程创建

(1)什么是线程? 线程(thread)是一个程序内部的一条执行路径。程序中只有一条执行路径,那么这个程序就是单线程的程序。 (2)多线程是什么? 多线程是指从软硬件上实现多执行流程的技术。 &…

让 ChatGPT 扮演一个艺术家,协助我们生成绘图 prompt

stable-diffusion Prompt 生成 直接生成 按照惯用的扮演思路,我们可以让 ChatGPT 扮演一个艺术家,协助我们生成绘图 prompt。考虑到 ChatGPT 和 DallE 同为 openai 公司产品,且 stable-diffusion 开源模型出现较晚,ChatGPT 训练…

【软件工程】UML序列图

一.概述 序列图(时序图)是一种软件工程行化建模方法,用于可视化系统或应用程序中多个对象之间 的交互。在序列图中,每个对象都表示为竖直线,对象之间的消息则表示为水平箭头 从一个对象指向另一个对象。 序列图可以…

搞懂 API ,地图 API 制作方法分享

地图 API 是一种基于 Web 开发的应用程序编程接口,可以用于创建和展示地图及地理信息。以下是一些地图 API 制作的方法: 选择地图 API 平台:目前市场上有很多地图 API 平台供选择,比如 Google Maps API、百度地图 API、高德地图 A…

2023年五月份图形化三级打卡试题

活动时间 从2023年5月1日至5月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

在阿里做测试开发的这5年,收获与感悟...

正好在离职交接空档期,就抽空简单分享自己的一些个人经历给大家,希望对刚毕业不久或者工作三五年的同学能有一些帮助。 测试新人 我的职业生涯开始和大多数测试人一样,开始接触都是纯功能界面测试。那时候在一家电商公司做测试,做…

基于异常值鲁棒性问题的极限学习机的回归问题研究(Matlab代码实现)

💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,逻辑清晰,为了方便读者。 ⛳️座右铭&a…

2023年五月份图形化四级打卡试题

活动时间 从2023年5月1日至5月21日,每天一道编程题。 本次打卡的规则如下: 小朋友每天利用10~15分钟做一道编程题,遇到问题就来群内讨论,我来给大家答疑。 小朋友做完题目后,截图到朋友圈打卡并把打卡的截图发到活动群…

【独具匠心设计】全网最好的国学,历代文学,名著,小说网推荐

极力推荐一个功能简单、易用、访问快捷、界面大气,清爽、资源丰富、设计专业、完全免费的文学网站。它的名字叫“历代文学”,是由成都心海科技公司所研发,设计真可谓独具匠心。 “历代文学”收录了来自古今中外 20 多个朝代,近 30个 国家的作…

消息队列选型

消息队列选型 大家好,我是易安!今天我们聊下消息队列常见选型。 消息队列作用 谈选型之前我们先讲下我们为什么需要消息队列。 消息队列是一种很流行的技术,自从系统间开始通信时,消息队列就出现了。然而,对消息队列给…

Windows 远程桌面提示没有远程桌面授权服务器可以提供许可证

可参考之前发布的一篇文章,帮助你远程登录:远程连接提示 由于没有远程桌面授权服务器提供许可证_计算机没有远程桌面客户端访问许可证_csdn_aspnet的博客-CSDN博客 虽然上述文章命令可以远程进入系统,但是每次都需要使用上述文章中的命令进入…

【数据库】索引和事务

目录 1.索引 1.1关于索引 索引是什么? 为什么要有索引? 索引的作用? 索引的优点和缺点? 1.2索引类型及创建 索引的分类 创建索引 1.3索引的数据结构 1.4索引覆盖 2.事务 2.1关于事务 概念 事务的使用 2.2事务的特…

他们是怎么使用上gpt-4的-gpt-4在哪用

为什么有人在使用GPT4 openAI尚未正式发布GPT-4模型,也没有公布任何与GPT-4相关的信息。因此,没有人可以在使用GPT-4模型。 值得注意的是,虽然OpenAI尚未正式发布GPT-4,但由于其之前发布的GPT-3具有出色的性能和功能&#xff0c…

chmod 命令 (chmod 0660)

chmod的作用: 用于设置文件所有者和文件关联组的命令,就是控制用户的权限命令 注意事项: chown 需要超级用户 root 的权限才能执行此命令。 自己常用chmod 命令是 chmod 777 * 给所有文件权限 chmod 777 文件名 给单独文件权限 这个777 是怎么来的, 或者chmod 0660 这…

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

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

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题,这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决: 对 PySide6/PyQT 多线程的使用不熟悉;在 PySide6/PyQT 的应用程序里有耗时任…

【Linux基础IO之 内存文件操作】

目录: 前言一、引入C语言中的文件操作系统文件操作open 位图权限close、write、readlseek C语言中的文件操作函数与系统文件操作函数的联系 三、文件描述符1.文件描述符是什么2.文件缓冲区再谈重定向 四、文件缓冲区分类语言级缓冲区为什么要有两个缓冲区 五、仿写c…

OpenGL入门教程之 变换

引言 这是一个闪耀的时刻,因为我们即将能生产出令人惊叹的3D效果! 变换 向量和矩阵变换包括太多内容,但由于学过线性代数和GAMES101,因此不在此做过多阐述。仅阐述包括代码的GLM内容。 GLM的使用 (1)GLM…

8、接口的高级用法

1、索引类型 我们可以使用接口描述索引的类型和通过索引得到的值的类型,比如一个数组[‘a’, ‘b’],数字索引0对应的通过索引得到的值为’a’。我们可以同时给索引和值都设置类型,看下面的示例: interface RoleDic {[id: number…