eBPF的发展演进---从石器时代到成为神(二)

news2024/11/17 17:31:58

3. 发展溯源

回顾技术的发展过程,就像观看非洲大草原日出日落一样,宏大的过程让人感动,细节部分引人深思。每天循环不辍,却又每天不同。

BPF的应用早已超越了它最初的设计,但如果要追溯BPF最初的来源,则必须回归到它最初的应用领域,再进行理解分析。

BPF最初的用途在于观测,最初用于网络报文的抓取和分析。

因此BPF的最初、最根本的来源,是作为一种观测手段出现的。

而在这个领域中,技术的演进迭代,是一个很长的过程,体现了内核技术发展的艰辛、也同时充满了趣味。

如果把内核看作一个世界,在这个广袤的土地上,观测技术的发展,也同样经历了从蒙昧到现代的发展过程。

每个时代都有其独具特色的观测技术,它决定了当时的开发人员需要具备什么样的功底,什么样的开发方式,这构成了一个时代特色,也谱写了时代的故事。

而每次时代的更迭,总是在某些方面颠覆了或者突破了传统的思维,从而引发了观测方式的巨大进步,促进了效率和可观测性的提升。对现有技术的深入研究与颠覆性的思想所构成的创新,是技术领域演进的基本形式。而其创新的动力又是什么呢?我们在后文逐步揭示。

3.1. 石器时代

曾几何时,内核的开发还在初始阶段,由于内核的原理复杂、所处的位置特殊,开发方式和用户态有很大不同。内核开发难度远远大于用户态的应用开发,尤其调试比较困难。犹记得那时对于内核是否引入GDB调试机制,有过一些争论。其分歧点就在于,引入过于复杂的机制会改变内核的行为特性,影响问题的稳定性,反而不利于问题的分析定位。

那时最值得信赖的工具就是printk了。这是一种低介入的观测工具,使用简单,几乎可以用于任何地方,帮助开发人员观测内核的运行状态。但显著的缺点是不够灵活,如果问题涉及的逻辑路径比较长、分支比较复杂的话,需要反复多次才能定位问题的根源。因此,那时候对内核开发人员的一个必不可少的要求,就是对所负责子系统的实现原理和代码逻辑的熟悉程度需要非常高,能够根据比较少的观测信息,准确定位问题的根源。

事物总是存在两面性,就像当初产生的那场争论一样,printk除了基本的信息输出机制外,几乎没有提供任何强有力的特性,这固然体现了当时的技术水平还在比较原始的阶段(没错,就像是石器时代),但同时也倒逼当时的内核开发人员超强的代码理解和分析能力。以便弥补简陋的工具对效率的掣肘,更快地解决程序中的BUG。

另一方面,客观地讲,printk固然简单,卓尔无往不利。它可以使用在任何地方,具有完全的上下文访问能力,不受约束的表达能力。

它的观测能力和程序本身完全相等,程序本身能看到什么它就能看到什么,可以说是强大到巅峰。这种强大也是其无法被取代的根本原因,尽管内核的调测技术不断在发展,这一点始终未被超越。

它可以用任何线性的文本形式,输出开发人员关注的上下文信息。在后来,这种表达能力得到了进一步发展,支持了部分正则文法。

它的缺点在于缺乏交互性,任何一点改变都需要修改程序。另一方面,不管上层流程是否被关注,它的信息都会被输出,大大影响了性能。

printk可以说是最强大的工具,至今我也是这样认为。但它同时也是最粗糙的工具。就像石头一样,prink随处可见,随处可用,用了就一定有所得。简单、强大、直接。但是同样像石头一样,如果用得多了,就会成为垃圾。

printk相比于BPF,拥有完全不受限制的上下文访问能力,使用的地方几乎没有限制,仅从观测的角度,强大之处有过之而无不及。但是使用方式过于原始,缺乏工业化的扩展能力,因此如果在更长的时间尺度、更广的应用领域来看的话,printk无法和BPF相提并论。

3.2. 铁器时代

在石器时代,人们使用石头磨制的工具进行生产,这些工具粗糙、非标准化、材质原始容易损坏,笨重、使用寿命短。

Printk也是一样,每次执行时都会输出信息,但大多数时候是不需要的;寿命短,每次改变需要修改代码。

随着内核越来越成熟,架构设计、模块划分、内部功能等等都越来越规范合理。内核的特性,由各个子系统分别负责,内核的整体表现是各个子系统行为表现的综合。而子系统内部的关键路径,决定了子系统主要的行为表现,比如:调度系统中的CPU时间统计、上下文切换,迁移等等;内存管理系统中的内存分配、NUMA平衡;虚拟内存中的页面错误、交换次数等等。

随着内核设计的规范化,其内部的关键节点和呈现在外部的语义都越来越清晰和标准化。要掌握内核的运行状态,其实并不需要随处观察,只需要掌握几个关键节点、关键信息就可以了。

以关键变量为基础,工具得以升级;以语义规范化为基础,为交互式的观测机制提供了基础。至此,观测手段不再是单纯的信息输出,它也可以反过来影响系统行为实现多维度的观测。

虚拟文件系统Proc首先打通了用户态和内核态的交互通道,从原来只能控制日志级别,到可以控制数据本身,可以控制的范围更广、更深了;从文本交互,转换为二进制交互,内核性能受到的影响进一步降低。

提供了标准化的API,类型的支持,降低了开发难度,便于推广使用。

提炼出关键参数,通过虚拟文件系统进行交互式的系统观测,反过来有利于内核的规范化。

3.3. 蒸汽时代

Proc的定义很大一部分,还是与具体的上下文相关,并不适合大批量的使用。

Trace定义了协议规范,抽象层次更高,可以批量使用。

Trace是一个更加纯粹的观测机制,给用户提供了通用简单的接口,底层实现了很丰富的机制。可以支持大量使用,对于可观测性的提升起到了根本性的推动。可以批量重复使用,这是它和其他观测方式的区别。

如果说Proc采用了代码数据化的思想,那么Trace采用很多元编程的思想,极大简化了外部接口,减少了重复代码。

3.4. 电气时代

Trace机制固然好用,只要预先铺设了基础设施,运行时就可以随时开启观测。但缺点是,对于没有铺设铁轨的地方,火车的承载能力再强也是无法到达的。

Trace的机制很通用,但另一方面,它无法深入业务层面进行更进一步的调测。要实现这一点,需要完整的上下文能力和可编程能力,因此kprobe出现了。

只要由函数的地方,就像通了电一样,随时可以点亮,这是Kprobe强于Trace的覆盖能力。能够完整访问函数上下文,这是Kprobe强于Trace的业务理解能力。

3.5. 智能时代

Kprobe是动态性的萌芽,但是很多方面不足。它在内核态运行,需要对内核编程有一定了解,编程门槛较高。它有安全性问题,它还有可扩展性问题,等等。

从计算能力来说,所有图灵机的计算能力是相等的,要解决能力问题,最终是要实现一个虚拟机的。而在内核态实现一个虚拟机,所涉及到的安全问题是必须考虑的,通过Verifier和运行时Helper函数,做到了逻辑约束和上下文隔离。虚拟机、Verifier和Helper函数,是BPF和Kprobe的根本区别。

 

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

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

相关文章

nginx(七十一)root、alias、index、try_files关系指令再探

一 root、alias、index、try_files辨析 说明: 这个系列很适合前端人员进阶学习 ① 前言回顾 try_files基础知识 配置try_files实现内容重定向 root和alias指令辨析 ​强调: 1) index只能处理以/结尾的请求2) ​index指令有点在location中判断请…

chatGPT账号apikey码-chatGPT 免费APIKEY

ChatGPT API Key免费吗 ChatGPT使用的API密钥可以免费获取,但是其使用可能会受到一些限制。具体而言,根据你所使用的API提供者和服务级别,免费的API密钥可能会受到以下限制: 次数限制:某些API可能会限制您的API调用次…

Centos 磁盘根目录扩容

Centos磁盘根目录扩容 1.扩容前检查 命令: df -Th or df -h 我们要扩张磁盘空间的就是挂载点为:/ (的这个) 2.添加sda磁盘空间查询磁盘 命令: fdisk -l 其实,我们可以将sda的磁盘新增空间分配给处于sda的 / 挂载目录 也可以跨磁盘将sdb(新磁盘…

约瑟夫环的三种解法(循环链表、数组和用数组模拟链表)

目录 前言 一、用循环链表实现 二、用数组实现 三、用数组模拟链表实现 前言 题目描述: 编号为 1 到 n 的 n 个人围成一圈。从编号为 1 的人开始报数,报到 m 的人离开。 下一个人继续从 1 开始报数。 n-1 轮结束以后,只剩下一个人&am…

dockerfile传参问题和权限问题

dockerfile传参问题和权限问题 一、docker传参 在工作中,使用dockerfile构建镜像的时候,随着业务越来越多,流水线也越来越多,这时候就需要构建一些通用流水线,而通用流水线最大的问题,就是需要传递参数&a…

Linux基础命令和程序部署

Linux基础命令 ls 可以查看当前目录内容ls 后面跟上一个具体路径可以查看指定目录内容ls -l 可以以列表的形式查看,缩写llpwd 查看当前目录的绝对路径cd 切换目录(就是window界面的鼠标双击目录进入动作),cd在切换目录时后面可以…

【教学类-34-05】拼图(彩色图片+圆角凹凸拼图)3*4格子(中班主题《个别化拼图》偏美术)

图片展示: 背景需求: 最近班级孩子得了传染病,来了2位孩子。 我觉得:人少的话,孩子们就有充足的时间去拼那些带有凹凸槽的自制彩色图形拼图。 难点: 1、从直线剪切(方形拼图)转…

Flink Join操作

目录 DataStream API(函数编程) window Join join coGroup interval Join Table API(flink sql) Reguler Join (常规join) inner join left join / right join full join interval join lookup join Window Join INNER/LEFT/RIG…

摄像头录像软件哪款好用?这款就很不错

案例:录屏时怎么录电脑摄像头? 【很多时候我不仅仅需要录制电脑屏幕,还需要在录屏时录入人像,可是我的录屏软件不支持录制人脸。有没有好用的电脑录屏带人脸的屏幕录制工具介绍?】 无论是教学、游戏直播、软件开发、…

HTML + CSS + JS 利用邮编查询 API 实现邮编查询工具

引言 邮政编码是地址信息的重要组成部分,可以帮助快递公司、物流公司等对地址进行快速、准确的识别和派送。因此,邮编查询工具应用在许多业务场景中都有广泛的应用,例如:电商平台、物流公司、金融机构等。通过使用邮编查询 API&a…

fiddler在请求头添加指定信息

下图所示,设置完请求头信息后,点击右上角Actions按钮的Run Filterset now保存信息,即可。

centos7部署FastDFS服务

一、安装需要的相关依赖 yum -y install make cmake gcc gcc-c 因为我的服务器已经安装了gcc,所以略去 使用gcc -v查看版本 yum -y install zip unzip 安装性能事件通知库 yum -y install libevent 安装nginx依赖 yum -y install libevent yum -y install zli…

MITA触摸屏维修WP4053米塔工控机控制屏维修

MITA-TEKNIK米塔触摸屏维修工控机工控屏控制器维修DISPLAY 2COM全系列型号 Mita-Teknik触摸屏维修常见故障:上电无显示,运行报故障,无法与电脑通讯,触摸无反应,触控板破裂,触摸玻璃,上电黑屏&a…

自动化工具 接口自动化测试引擎

一、前言: 1、解决痛点:接口自动化测试用例需要人去开发、去维护。 2、实现第一性原理:根据定义的测试策略自动生成接口测试用例。 二、引擎优势: 1、提升人效:降低传统方式中接口测试开发与维护的工作量。 2、覆盖更…

输电线路在线监拍设备的国网协议对接方案

疫情过后,尤其山东淄博电力建设的发展,电网规模的不断研发,高压远距离架空输电线路日益增多,在复杂地形条件下的电网建设和设备维护工作也越来越多。 如何解决4G模块控制的功耗,和信号传输方面有一套完整的方案。基于合…

【网络安全】红队基础免杀

引言 本文主要介绍“反射型 dll 注入”及“柔性加载”技术。 反射型 dll 注入 为什么需要反射型 dll 注入 常规的 dll 注入代码如下: int main(int argc, char *argv[]) {HANDLE processHandle;PVOID remoteBuffer;wchar_t dllPath[] TEXT("C:\\experime…

从源码全面解析LinkedBlockingQueue的来龙去脉

一、引言 并发编程在互联网技术使用如此广泛,几乎所有的后端技术面试官都要在并发编程的使用和原理方面对小伙伴们进行 360 的刁难。 二、使用 对于阻塞队列,想必大家应该都不陌生,我们这里简单的介绍一下,对于 Java 里面的阻塞…

【 SpringBoot 统⼀功能处理 】

文章目录 引言一、⽤户登录权限效验Spring 拦截器拦截器实现原理扩展:统⼀访问前缀添加 二、统⼀异常处理三、统⼀数据返回格式四、ControllerAdvice 源码分析 引言 接下来是 Spring Boot 统⼀功能处理模块,是 AOP 的实战环节,要实现的课程⽬…

轨道交通信号系统的可靠性与安全性

01.引言 城市轨道交通系统作为大容量公共交通工具,其安全性直接关系到广大乘客的生命安全,所以要求城市轨道交通系统在如此高的运行密度下,还要保证安全和高效率的运行。而信号系统作为保证列车安全、正点、便捷、舒适、高密度不间断运行的重…

Filter 过滤器基本内容及案例改进

举个例子 假设在Web资源中,A资源要写5行代码,而B资源也要写一模一样的5行代码,这时就把这些代码都提取出来, 在过滤器里写这些代码,因为访问任何资源都要经过过滤器,在过滤器走一遍就可以,而不用…