BPF技术整理笔记

news2024/11/26 8:55:35

目录

  • 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/471671.html

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

相关文章

Bitmap引起的OOM问题

作者:向阳逐梦 1.什么是OOM?为什么会引起OOM? 答:Out Of Memory(内存溢出),我们都知道Android系统会为每个APP分配一个独立的工作空间,或者说分配一个单独的Dalvik虚拟机,这样每个APP都可以独立…

你的 Redis为什么变慢了?一文讲透Redis性能优化如何做

一、Redis为什么变慢了 1.Redis真的变慢了吗? 对 Redis 进行基准性能测试 例如,我的机器配置比较低,当延迟为 2ms 时,我就认为 Redis 变慢了,但是如果你的硬件配置比较高,那么在你的运行环境下&#xff…

哈夫曼树【北邮机试】

一、哈夫曼树 机试考察的最多的就是WPL,是围绕其变式展开考察。 哈夫曼树的构建是不断选取集合中最小的两个根节点进行合并,而且在合并过程中排序也会发生变化,因此最好使用优先队列来维护单调性,方便排序和合并。 核心代码如下…

2023有哪些适合学生的蓝牙耳机?盘点四款适合学生的无线蓝牙耳机

随着时代的发展,人们更青睐于能够提升生活品质的产品。蓝牙耳机因为摆脱了线的束缚,使用体验会更好。接下来,我来给大家推荐几款适合学生用的无线蓝牙耳机,有需要的朋友可以当个参考。 一、南卡小音舱Lite2蓝牙耳机 参考价&…

探索未来的数字人生:全景VR数字人

在数字化时代,人工智能和虚拟现实技术正日益成为我们生活中不可或缺的一部分。而全景VR数字人,则是这一时代的最新产品,吸引了越来越多的关注和研究。 一、什么是全景VR数字人? 全景VR数字人是一种通过虚拟现实技术创造的数字人形…

学术ChatGPT——利用ChatGPT助力日常工作与学习

ChatGPT的出现给各个行业带来了前所未有的冲击,其中也包括学术研究领域。在学术研究领域,有着「数学天才」之称陶哲轩之前就曾表示,他已经将ChatGPT纳入了自己的工作流程。 那么做为一名普通的工作或者学习的人员,如何使用ChatGPT…

[mars3d 学习] 最近升级版本造成的问题

1、mars3d升级3.5以上,使用的时候报错; 需要看下 Mars3D三维可视化平台 | 火星科技 版本更新日志; 使用将Cesium的版本升级到1.103 2、升级Cesium到1.103,之后打包又会报错 - error in ./node_modules/mars3d-Cesium/Build/Cesi…

用手机APP操作使用井用采样器更省时省力

井用采样器的主要功能特点就是:机身小巧,方便操作。可用于井下作业,手机APP可实时查看采样数据,节省人力。 利用自动采样器进行水样采集可以说节省很大的人力物力,但是有时为了采到更具代表性的水样,我们需…

如何选择多参数水质分析仪?

如何选择适合的多参数水质分析仪? 首先水质检测仪分为实验室(台式)和户外使用的便携式多参数水质检测仪。我们呢就要了解自己的需 求使用在什么领域,根据使用领域选择仪器;其次就是选择需要测定的指标,最好…

JAVA-6-[Spring框架]Bean的作用域和生命周期

1 Spring Bean 1、Spring有两种类型bean,一种普通bean,另外一种工厂bean(FactoryBean)。 2、普通bean:在配置文件中定义的bean类型就是返回的类型。 3、工厂bean:在配置文件中定义的bean类型可以和返回类型不一样。 第一步 创建类…

Streamlit 使用介绍

Streamlit 使用介绍 安装和运行参考资料 公共组件页面设置显示代码并运行st.help 查询帮助文档多页渲染 对象渲染直接渲染对象文本渲染st.markdown代码渲染公式渲染 展示图表显示表格趋势小卡片 显示图表显示媒体画迷宫显示本地图片播放视频/音频 显示状态彩蛋-放气球进度条 互…

KVM虚拟机的定时逐次开机设定方法-systemd方式

前言:KVM虚拟机系统是榨取服务器最大性能的一种好方法,但是谁也不想让服务器启动的时候要等待5分钟甚至以上的时间。 为了减轻服务器开机时的任务数量,需要虚拟机在开机后一段时间内,按顺序逐次启动,以达到各个服务间的…

A Time Series is Worth 64 Words(PatchTST模型)代码解析

前言 A Time Series is Worth 64 Words论文下载地址,Github项目地址,论文解读系列本文针对PatchTST模型参数与模型架构开源代码进行讲解,本人水平有限,若出现解读错误,欢迎指出开源代码中分别实现了监督学习(PatchTST…

千万级直播系统后端架构设计

1、架构方面 1.1 基本 该图是某大型在线演唱会的直播媒体架构简图。 可以看出一场大型活动直播涵盖的技术方案点非常庞杂,本节接下来的内容我们将以推拉流链路、全局智能调度、流量精准调度以及单元化部署,对这套直播方案做一个展开介绍。 1.2 推拉流链…

2023年大厂裁员严重,软件测试行业真的饱和了吗?

这短时间以来后台有很多小伙伴说找工作难,并且说软件测试行业饱和了?竟然登上了热榜 那么我今天带大家看看真实的市场行情,往下看 这个是公司联合某厂的HR招聘真实情况,很明显【软件测试】投简历竟然高达9999沟通才1千多&#xf…

chatgpt 中文版免费访问

chatgpt 中文版免费访问 简介一、ChatGPT中文网二、 ChatGPT三、ChatGPTWEB四、博弈AI五、小熊共享六、tab精灵七、AI文本工具站1、有直接chatgpt体验对话2、文案工具箱 简介 最近chatgpt太火了,用起来十分方便。chatgpt是一种基于人工智能技术的语言模型&#xff…

区间DPⅡ (Java) 解析/模板/案例

一. 区间DP简单介绍 二. 区间DP模板 三. 区间DP经典案例 1.leetcode1312 让字符串成为回文串的最少插入次数 2.leetcode1039 多边形三角剖分的最低得分 以上部分,见 区间DP (Java) 解析/模板/案例 3.leetcode1547 切棍子的最小成本 有一根长度为 n 个单位的…

IndexedDB的包装器JsStore - insert插入参数配置

JsStore是IndexedDB的包装器。它提供了简单的SQL,如api,易于学习和使用。IndexedDb查询可以在web worker中执行,JsStore通过提供一个单独的worker文件来保留这个功能。 Insert API用于在表中插入新记录,还可以为未在db模式中定义的…

使用InitializingBean和DisposableBean来管理bean的生命周期

1.InitializingBean接口 1.1.InitializingBean接口概述 Spring中提供了一个InitializingBean接口,该接口为bean提供了属性初始化后的处理方法,它只包括afterPropertiesSet方法,凡是继承该接口的类,在bean的属性初始化后都会执行…

docker compose 安装kafka集群

使用docker compsose部署kafka,方便快捷,启动方便。 1. 拉去镜像 docker pull bitnami/zookeeper:3.6 docker pull bitnami/kafka:3.0 docker pull hlebalbau/kafka-manager 2. 编辑docker compose文件 version: "3" services: zookeeper…