linux内核有ebpf吗,聊聊很重要的内核技术eBPF

在2018年的 Linux Plumber 大会上,eBPF成了亮点,有24个议题提到了 eBPF,可以预计eBPF会成为一大技术热点。

eBPF(Extended Berkeley Packet Filter) 的核心是驻留在 kernel 的高效虚拟机。最初的目的是高效网络过滤框架,前身是 BPF。

8617cde097474509dae255c94a93d993.png

Linux kernel 3.18版本开始包含了eBPF,相对于 BPF 做了一些重要改进,首先是效率,这要归功于 JIB 编译 eBPF 代码;其次是应用范围,从网络报文扩展到一般事件处理;最后不再使用socket,使用map进行高效的数据存储。

根据以上的改进,内核开发人员在不到两年半的事件,做出了包括网络监控、限速和系统监控。目前eBPF可以分解为三个过程:

以字节码的形式创建 eBPF 的程序。编写C代码,将LLVM编译成驻留在ELF文件中的eBPF字节码。

将程序加载到内核中,并创建必要的 eBPF-maps。eBPF 具有用作 socket filter,kprobe 处理器,流量控制调度,流量控制操作,tracepoint 处理,eXpress Data Path(XDP),性能监测,cgroup 限制,轻量级tunnel的程序类型。

将加载的程序attach到系统中。根据不同的程序类型attach到不同的内核系统中。程序运行的时候,启动状态并且开始过滤,分析或者捕获信息。

2016年10月的NetDev 1.2大会上,Netronome的Jakub Kicinski和Nic Viljoen发表了标题为“eBPF / XDP硬件卸载到SmartNIC”。 Nic Viljoen在其中介绍了Netronome SmartNIC上每个FPC每秒达到300万个数据包,每个SmartNIC有72到120个FPC,可能最大支持eBPF吞吐量4.3 Tbps!(理论上)

eBPF 触发了新一代网络、安全性、应用程序配置/跟踪和性能故障排除等领域的工具开发,这些工具不再依赖现有的内核功能,而是在不影响执行效率或安全性的情况下主动重新编程运行时行为。

那我们看看有哪些基于 eBPF 的工程,这些工程或许你已经知道,或是已经经常使用。

基于eBPF的项目

BCC是用于创建基于eBPF的高效内核跟踪和操作程序的工具包,其中包括一些有用的命令行工具和示例。 BCC简化了用C进行内核检测的eBPF程序的编写,包括LLVM的包装器以及Python和Lua的前端。它还提供了用于直接集成到应用程序中的高级库。

bpftrace是Linux eBPF的高级跟踪语言。它的语言受awk和C以及DTrace和SystemTap等以前的跟踪程序的启发。 bpftrace使用LLVM作为后端将脚本编译为eBPF字节码,并利用BCC作为与Linux eBPF子系统以及现有Linux跟踪功能和连接点进行交互的库。

Cilium是一个开源项目,提供基于eBPF的联网,安全性和可观察性。它是从头开始专门设计的,旨在将eBPF的优势带入Kubernetes的世界,并满足容器工作负载的新可伸缩性,安全性和可见性要求。

Falco是一种行为活动监视器,旨在检测应用程序中的异常活动。 Falco在eBPF的帮助下审核Linux内核层的系统。它使用其他输入流(例如容器运行时度量标准和Kubernetes度量标准)丰富了收集的数据,并允许连续监视和检测容器,应用程序,主机和网络活动。

Katran是一个C ++库和eBPF程序,用于构建高性能的第4层负载平衡转发平面。 Katran利用Linux内核中的XDP基础结构来提供用于快速数据包处理的内核功能。它的性能与NIC接收队列的数量成线性比例,并且使用RSS友好的封装转发到L7负载平衡器。

a7c4430520990c83062c3828c0045ae0.png

Sysdig是提供深层系统可见性的简单工具,并具有对容器的原生支持。

其他基于eBPF技术的项目还有很多,比如kubectl-trace ,ply 等,这里不再赘述。

如何编写一个eBPF程序?

在很多情况下,不是直接使用eBPF,而是通过Cilium,bcc或bpftrace等项目间接使用eBPF,这些项目在eBPF之上提供了抽象,并且不需要直接编写程序,而是提供了指定基于意图的定义的功能,然后使用eBPF实施。

如果不存在更高级别的抽象,则需要直接编写程序。 Linux内核希望eBPF程序以字节码的形式加载。虽然当然可以直接编写字节码,但更常见的开发实践是利用LLVM之类的编译器套件将伪C代码编译为eBPF字节码。

8551f6cb0d90f56231f19ee871bcb553.png

在编写eBPF程序之前,需要简单了解几个概念。

1)map(映射) :BPF最令人着迷的方面之一是,内核上运行的代码和加载了该代码的程序可以在运行时使用消息传递相互通信。

BPF映射是驻留在内核中的键/值存储。任何BPF程序都可以访问它们。在用户态中运行的程序也可以使用文件描述符访问这些映射。只要事先正确指定数据大小,就可以在映射中存储任何类型的数据。内核将键和值视为二进制 blobs,它并不关心您在映射中保留的内容。

BPF验证程序包括多种保护措施,以确保您创建和访问映射的方式是安全的。当我们解释如何访问这些映射中的数据时,我们也将解释这些保护措施。

当然BPF映射类型有很多,比如哈希表映射,数组映射,Cgroup 数组映射等,分别满足不同的场景。

2)验证器

BPF验证程序也是在您的系统上运行的程序,因此,对其进行严格审查是确保其正确执行工作的目标。

验证程序执行的第一项检查是对VM即将加载的代码的静态分析。第一次检查的目的是确保程序有预期的结果。为此,验证程序将使用代码创建有向循环图(DAG)。验证程序分析的每个指令将成为图中的一个节点,并且每个节点都链接到下一条指令。验证程序生成此图后,它将执行深度优先搜索(DFS),以确保程序完成并且代码不包含危险路径。这意味着它将遍历图的每个分支,一直到分支的底部,以确保没有递归循环。

这些是验证器在第一次检查期间可能拒绝您的代码的情形,要求有以下几个方面:

该程序不包含控制循环。为确保程序不会陷入无限循环,验证程序会拒绝任何类型的控制循环。已经提出了在BPF程序中允许循环的建议,但是截至撰写本文时,没有一个被采用。

该程序不会尝试执行超过内核允许的最大指令数的指令。此时,可执行的最大指令数为4,096。此限制是为了防止BPF永远运行。在第3章,我们讨论如何嵌套不同的BPF程序,以安全的方式解决此限制。

该程序不包含任何无法访问的指令,例如从未执行过的条件或功能。这样可以防止在VM中加载无效代码,这也会延迟BPF程序的终止。

该程序不会尝试越界。

验证者执行的第二项检查是BPF程序的空运行。这意味着验证者将尝试分析程序将要执行的每条指令,以确保它不会执行任何无效的指令。此执行还将检查所有内存指针是否均已正确访问和取消引用。最后,空运行向验证程序通知程序中的控制流,以确保无论程序采用哪个控制路径,它都会到达BPF_EXIT指令。为此,验证程序会跟踪堆栈中所有访问过的分支路径,并在采用新路径之前对其进行评估,以确保它不会多次访问特定路径。经过这两项检查后,验证者认为程序可以安全执行。

3) hook : 由于eBPF是事件驱动的,所以ebpf是作用于具体的hook的。根据不同的作用,常用的有XDP,trace,套接字等。

4)帮助函数:eBPF程序无法调用任意内核功能。允许这样做会将eBPF程序绑定到特定的内核版本,并使程序的兼容性复杂化。取而代之的是,eBPF程序可以调用帮助函数,该函数是内核提供的众所周知且稳定的API。

总结

安全,网络,负载均衡,故障分析,追踪等领域都是eBPF的主战场。对于云原生领域,Cilium 已经使用eBPF 实现了无kube-proxy的容器网络。利用eBPF解决iptables带来的性能问题。

整个eBPF生态发展比较好,社区已经提供了诸多工具方便大家编写自己的eBPF程序。

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

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

相关文章

oom linux 导致ssh,Linux OOM

8种机械键盘轴体对比本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?某个机器看到一条日志:Out of Memory: Kill process xxx (xxx) score 707 or sacrifice child并且syslog, ssh等进程都被kill掉了.简单了解了下OOM(Out of Memory)…

c语言bfs程序讲解,面试算法--二叉树DFS/BFS实现(C语言)

深度优先搜索算法(Depth First Search)DFS是搜索算法的一种。它沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已发现从源节点可达的所有节点为止。如果还…

c语言 子进程,子Shell和子进程

Shell 中有很多方法产生子进程,比如以新进程的方式运行 Shell 脚本,使用组命令、管道、命令替换等,但是这些子进程是有区别的。子进程的概念是由父进程的概念引申而来的。在 Linux 系统中,系统运行的应用程序几乎都是从 init(pid为…

学C语言办公本和游戏本,为什么不建议买游戏本?入手前须知,别只看中游戏...

原标题:为什么不建议买游戏本?入手前须知,别只看中游戏作为一名游戏本用户,我自己在用的游戏本已经用了四五年的时间了,从最初的大学生到毕业工作2年时间,这一游戏本给我带来了不少麻烦。最大的麻烦就是“笨…

Android ui 单元测试 覆盖率,Android单元测试—UI测试(Espresso)

前言我们先回顾一下,在上一篇博客中,主要分享了Android单元测试的逻辑测试部分。接下来,我们重点讲解Android单元测试的UI测试部分!何为UI测试呢?就是对用户界面的交互元素进行测试,如TextView、ImageView&…

android shape 圆角百分比,Android shape显示圆角问题

当需要定义一个圆角效果,当在ADT中预览,没有有效果时,只要运行就可以了!xmlns:Android"http://schemas.android.com/apk/res/android">android:state_pressed"true">android:startColor"#ff8c00"android:endColor"#FFFFFF…

android 删除垃圾文件夹,别再用手机管家清理垃圾了!删除这些文件夹,内存瞬间释放几个G...

随着手机使用时间的增加,手机中缓存的东西越来越多,这时候手机内存空间就会告急,从而影响手机的流畅性。那么在这种时候不要乱清理,我们只需要删除这几个文件夹,就可以帮手机轻松释放好几个G的内存。下面我们就一起来看…

计算机的应用技术课程的看法,统计教学与计算机应用的几点看法论文

统计教学与计算机应用的几点看法论文一、传统教学方法的局限性和弊端统计学是一门关于搜集、整理、汇总、描述和分析数据资料,并在此基础上进行推断和决策的方法论科学,具有很强的应用性、实践性。统计学课程是中等职业学校、财经类专业的基础核心课程。…

jupyter可以打开HTML文件吗,Jupyter ~ 像写文章般的 Coding (附:同一个ipynb文件,执行多语言代码)...

前面用了很久Notebook来交互式编程了,此次说说几个其余的选项:htmlNotebook Markdown此次选Markdown模式(关于Markdown基础能够看以前写的Markdown Base)python和代码同样,Shift回车就能够预览了,怎么样是否是很酷的感受&#xff…

计算机网络技术基础教学内容,计算机网络技术基础

无计算机网络技术基础》课程教案一 计算机网络技术基础》课题: 课题:计算机网络概述(一) ) 教学顺序: 教学顺序:1 教学时数: 教学时数: 2 学时 教学目的:了解计算机网络产生的背景,掌…

计算机表格收入水平怎么算,怎么用excel计算工资所得税

利用Excel表格计算工资所得税?单位工资发放大多采用计算机管理,对一些小企业没有采用工资软件的,一般用Excel表来计算工资。下面小编就教你怎么用excel计算工资所得税。excel计算工资所得税的步骤:1、假设工资的所得税起征点为3500,具体阶段如下表。2、…

同一网段计算机无法共享打印机,Win7同一个局域网内共享打印机不成功的修复方法...

打印机共享需要在同一个局域网内完成,这样打印机可以共享多台电脑。一位用户说自己的打印机和台式Win7系统电脑的连接已经成功,但就是没办法打印机文件,怎么回事呢?win7系统共享打印机的前提是需要关闭杀毒软件和win7系统的防火墙…

嵌入式计算机的特点和应用,以下描述中,()不是嵌入式操作系统的特点。A.面向应用,可以进行裁剪和移植B.用 - 信管网...

第4题:在分布式数据库中包括分片透明、复制透明、位置透明和逻辑透明等基本概念,其中:()是指局部数据模型透明,即用户或应用程序无需知道局部场地使用的是哪种数据模型。A.分片透明B.复制透明C.…

计算机二维全息图原理,三维信息加密如何使用计算全息进行

全息加密技术作为一种特殊的加密方法被广泛应用于信息加密和防伪等领域。在全息加密过程中,光波的波长、记录距离和入射角度等参数用做加密密钥和解密密钥被人们深入研究,但所加密的信息几乎都是二维信息。为此利用一种基于虚拟光学的对三维信息进行加密…

hashmap为什么是2的倍数_HashMap源码解析(jdk1.8)

HashMap在java中使用的频率很高,同时也是面试时的必问的问题。今天咱们就来学习下jHashMap的源码,版本为jdk1.8。学习之前,先一起了解下HashMap的数据结构,便于理解后面所讲的内容。HashMap的底层数据结构由图可见,Has…

消息队列_消息队列:kafka

概念kafka是一个分布式的基于发布/订阅模式的消息队列,主要用于大数据实时处理领域。要理解kafka首先要有分布式的概念,要有消息队列的概念。分布式系统最大的优势就是解耦和削峰,这种情况下,A系统生成了一个消息,B系统…

kopernio显示无效程序_陆风路虎外观设计专利无效案一锤定音,最高法:陆风X7专利无效...

点击上方“华商报”可快速关注哦!持续5年多的路虎、陆风外观设计专利有效性之争终于尘埃落定:华商报记者日前从代理律师处获悉,最高人民法院近日驳回了江铃控股有限公司的再审请求,这意味着,陆风X7的外观专利无效。陆风…

掩膜区域内像素值_MRI ADC值是怎么来的?咱们来手算一下

首发公众号“医影杂记”ADC(Apparent diffusion coefficient),表观弥散系数,用于描述DWI序列中不同方向的分子扩散运动的速度和范围,是MRI DWI(Diffusion-weighted imaging, 弥散加权成像)中最常…

计算机上的查找替换功能快速格式化,Word2013文档中使用查找和替换功能来快速更改文本格式的方法...

在对文档进行处理时灵活使用Word的查找和替换功能将能够取得事半功倍的效果。下面介绍Word2013文档中使用查找和替换功能来快速更改文本格式的方法。1、在“开始”选项卡中单击“编辑”组中的“替换”按钮,打开“查找和替换”对话框,切换到“替换”选项卡…

composer 依赖包版本冲突_composer快速入门教程

php中文网最新课程每日17点准时技术干货分享Composer 是 PHP 的一个依赖管理工具。我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个命令将其他人的优秀代码引用到我们的项目…