- 外在驱动
由以上简要的回顾和梳理可见,内核开发者们所一直寻找的是一种充沛表达能力的动静机制,进而突破内核和用户态的壁垒(至多在逻辑层面),从而实现一种自在、间接的需要实现。技术成为内核开发者们尖锐的工具,一直冲破限度,揭示事物的实质。
BPF 技术的呈现和倒退,从时间尺度来说并不长,然而从其内在的驱动来说,有着简单的动因,是很多因素就和在一起的必然结果。因为其复杂性,从任何一个孤立的角度进行剖析都是不充沛,只有从各个不同的角度剖析,才能够体会出不同的趣味。
通过探寻其深层次的起因,能够梳理出更加清晰的倒退脉络,从而能够更好地瞻望 BPF 及其相干技术畛域的将来倒退。为咱们学习、钻研和退出 BPF 的倒退打下基础。
本文试着从复杂性、微内核化两个方面,剖析 BPF 倒退的外在能源。
内核的倒退历史就是一个复杂性一直递增的历史,因而内核的倒退也是一直管制复杂性、维持内核代码的可了解性的过程。因而,内核的开发始终保持一个准则,就是机制与策略的拆散。
在不同期间,如何进行机制与策略的拆散,有这不同的答案。随着技术和利用的一直倒退,维持这一准则的的难度是一直减少的,须要更新的思维、更先进的技术能力撑持。或者也能够说,正因为内核的倒退过程中,始终保持了这个准则,所以才一直有影响深远的根底技术的呈现。
我置信,要实现定制与动静,有很多不同的计划。但我认为 BPF 的呈现是最佳的抉择,使内核的倒退有了应答将来变局的根底。
这是 BPF 呈现的契机,也是其将来疾速倒退的能源。
4.1 代码规模问题
Linux 我的项目倒退至今,其代码总量早已超过千万,是一个十分宏大的我的项目。
注:起源 https://www.phoronix.com/misc/linux-eoy2019/lines.html
由统计数据能够看出,Linux 我的项目的复杂度(从代码量角度)始终在一直增长。
4.2 软件结构的简单
整个软件系统,从应用程序到内核是一个繁冗的层次结构,又因为模块之间的穿插,理论的运行流程是一个简单的有向图构造。
以实现一次简略的文件操作为例,首先应用程序须要 open 一个文件,这首先会运行到某种运行时库,实现资源分配、接口转换等等解决。而后,流程才会到零碎调用这一层。
零碎调用中,由 VFS 解析文件门路信息,找到对应的文件系统信息。再由具体的文件系统实现文件关上的操作。
这其中至多波及到了应用程序、运行时库、零碎调用、VFS、文件系统等多个档次。如果再细分的话,还波及到用户态内存治理,内核态内存治理、权限治理、命名空间治理、句柄治理、缓存治理、锁、钩子等次级模块。
目前 Linux 反对的文件系统至多曾经达到七十多种,有基于本地存储设备的、基于网络的、分布式的、基于内存的、虚构的等等。有的文件系统在内核态实现,有的在用户态实现。
另外,C 语言的条件编译,能够针对应用场景抉择适宜的代码编译。每一个条件编译选项就是对事实条件的一个考量。从 Linux 整个源码树中应用的条件编译选项的数量,也能够反映出 Linux 整个源码的复杂度。对 Linux 5.10 的源代码粗略统计,条件编译选项曾经多达 18000 多个;而在 6.1 版本中,曾经达到了 19000 多个。
4.3 业务零碎的简单
在虚拟化技术以前,不同利用场景的业务零碎的构造差别,次要体现为平面性的拓扑构造的差别,比方:对等式的、分布式的、客户服务器模式的等等,因为网络拓扑构造的不同、节点承当的业务角色的不同,造成了各种各样的业务零碎。
在虚拟化技术呈现后,云计算迅猛发展,云成为了信息系统的基础设施。业务零碎的差别不仅仅体现在横向拓扑构造上,其本身逻辑的深层组成也是非常复杂。它能够运行在实在计算机上也可能在虚拟机上,可能在一个独立的命名空间,也可能和别的业务共享。不同业务模块之间的分割有可能是间接的,也可能在无奈感知的状况下被层层嵌套。
业务零碎的复杂性,体现在业务的复杂性与业务零碎的复杂性两个方面。业务的简单,导致咱们须要对业务零碎进行分层设计,须要有定制化的能力,须要有经营与继续开发并行的能力。上线前的产品级的开发很重要,然而上线后的业务级的继续定制和开发同样重要。简单的业务必然导致简单业务零碎的产生,如何以一个对立的、足够弱小的形式来解决复杂性问题,使简单业务零碎的复杂性是能够拆解的、可治理的,就十分重要。
4.4 保护限度的要求
Linux 零碎曾经规模化运行在各种类型的设施上,每一个商业系统,在其运行期间都是须要进行保护的。
对于大型的服务器零碎,承载在成千上万的在线业务,是不能中断服务的,须要在线的定制能力。
对于集体终端,每个人的应用习惯不同,如何使每个用户都能获得最佳的应用体验,须要数据分析和个性化的定制能力。
对于分布在各处角落的边缘节点乃至物联网设施,须要内核提供更智能的染指办法,使保护人员可能近程实现对大量设施的保护工作。