背景介绍
内容概要
BPF是什么?
首先,BPF是什么?需要回答BPF的是什么?首先,必须回答为什么需要。
几年前,很多程序,例如网络监视器作为用户级别的进程运行。为了分析仅在内核空间中执行的数据,必须将这些数据从内核空间复制到用户空间的存储器中以进行上下文切换。与直接在内核空间分析这些数据相比,这导致了更大的性能开销。
随着近年来网络速度和流量喷雾式的增加,一些应用必须处理大量的数据。在用户空间监视分析中,由于很多流量数据无法执行,BPF产生了在内核空间执行高效安全程序的机制。
下图是BPF概览,从上面的论文开始:
BPF将两个革新引入数据包过滤:
新的虚拟机设计可以在基于寄存器结构的CPU上有效地工作。
应用程序使用高速缓存仅复制与过滤后的数据包相关的数据,不复制数据包的全部信息,最大限度地减少BPF处理后的数据,提高处理效率。
eBPF由执行字节码命令、存储对象、辅助函数构成。下图是eBPF作业原理的演示图。
eBPF字节码命BPF 令在执行内核之前必须通过BPF验证,并且当BPFJIT模式的内核被启用时,命令直接传送到可执行内核的本地命令,并且执行效率高。
BPF的超能力是什么?
在知道BPF的超能之前,先看看现在Linux内核有什么样的困难。
最重要的是不能允许在内核内运行强大的安全性,即不可靠的代码。
但是,为了达成上述目标,不比想象的简单。
没有实际加载程序的权限BPF
访问任意内核空间的存储数据
将任意内核空间的存储器数据露出到用户空间
继续交付:JIT编译后,将编译的程序附加到内核的各种系统调用的挂钩上。此外,如果对系统的动作没有影响,则可实时在线替换Linux内核中执行的BPF程序。例如,在处理网络数据包的应用中,在处理每秒数十万个数据包的情况下,在一个数据包和下一个数据包之间,加载到网络系统中,若调用Hook上的BPF程序,则自动被置换预期前一个分组将在旧版本的程序中处理。下一个分组可以看到新版本的程序。没有中断。这是通过无缝升级,可以持续交货的能力。
接下来,简单说明BPF超能力的核心技能点。
(01010110)
BPF超能力的技能要点——BPF Hooks
最初的技能点是“BPF Hooks”,也就是说BPF挂钩,也就是内核中,可以在哪个地方加载程序?
system cals
下图中的内核码的段是用于判定的程序类型:
(0101010111)
BPF超能力的技能要点——BPF Map
第二个关键点——“BPF Map”。
(01010112)
一个程序通常需要复杂的逻辑部分。那个是记录数据的状态。对于程序来说,数据的状态、统计信息、指标信息可以存储在哪里?这是BPF Map的作用。BPF程序本身只是命令,不包含实际的数据及其状态。我们可以用BPF程序来制作。这个BPF Map和其他编程语言一样Map数据结构相似。有各种各样的类型。经常使用的是Hash和ary类型。
Hashtables、Arays
Ring Buffer
Stock Trace
如下图所示创建典型的BPF Map代码。
(01010113)
值得一提的是
BPF Map能够访问用户空间来进行动作。
BPF Map可以和BPF分离程序。也就是说,创建了BPF Map的BPF程序执行结束后,这个BPF Map不是和程序一起消失,而是存在。
根据上述两个特征,BPF Map在利用持久化数据不丢失重要数据的同时,更新程序逻辑,在不同的程序之间共享信息,收集统计信息和指标等的场景中特别有用。
(01010114)
例如,BPF不知道程序如何生成一个随机数。有辅助函数的话,可以搜索内核来听。通过辅助函数BPF也实现了与任何操作系统内核的相互作用,因为这些是稳定的ApI,所以BPF程序可以跨越内核版本进行移植。
下图是部分BPF辅助函数的列表。
(01010115)
BPF超能力的限制
介绍完这些BPF超能力的技能要点后,接下来说明超能力有限制。
(0101010116)
BPF虽然技术很强大,但是为了保证内核的处理安全和及时应答,内核对BPF技术给予了很多限制。
eBPF程序无法调用任何内核参数。仅限于内核模块中列出的BPFHelper函数。函数支持列表也随着内核的发展而增加。
eBPF不能包含无法到达程序的命令。防止无效代码的加载,延迟程序的结束。
eBPF程序有循环数限制,必须在限制时间内结束。
eBPF堆栈大小被限制为MAXBPF stack,内核Linux5.8版本被设置为512。现在没有增加这个限制的计划。解决方法会变更。尺寸是无限的。
BPF应用场景
(01010117)
Cilium
另外,BPF控制Linux因为可以动态插入系统的程序,所以实现了强大的安全可视化功能,这些变化对于应用代码的更新和应用服务的重新启动本身是有效的。
以上的特性使得即使在大规模的容器环境中也可以具有高伸缩性、可视化和安全性。
(010118)
(0101010119)
Falco
Falco如何使用eBPF程序来实现实时应用监视器?
以下是几个Falco默认监视规则的示例。
(010120)
(0101010121)
(010122)
(0101010123)
(01010124)
(010125)
(0101010126)
BPF社区和生态BPF社区网站
各种社区网站是学习BPF的好地方。以下是推荐的社区网站。
学习技术必须从源代码开始。接下来是关于BPF的代码仓库。
学习技术也需要沟通。以下是推荐的交流渠道。
BPF社区的老板娘们
(01010127)
BPF本
《Linux内核观测技术BPF》是最近出版的第一本BPF中文的书,是上述英文的书的翻译版。范彬和狄卫华两个人翻译。
BPF技术共享
各种大会eBPF推荐能够关注技术共享。
使用技术的项目
罗列使用技术的项目:
Falcofrom 介绍Sysdig
中文在社区中
网易小船进行系统检查和网络优化
字节跳动管理高性能网络ACL
很多IT公司在各个领域使用BPF技术。
技术怎么学?
最后,说明如何学习技术。
(01010128)
其中重要的是在开始学习的时候制定计划。
(01010129)
我认为制定计划对大多数人来说是获得成功的结果所必要的条件,制定计划的过程是整体考虑的过程。当然计划不会变。根据自己的学习节奏和输出效率,可以根据需要适当调整。下图是我最初制作的BPF学习计划。
(0130)
完成第一阶段后,可以对该技术的背景和用语进行初步识别。接下来选择感兴趣的地方作为切入口,深刻理解该技术的使用场景和动作原理。也就是说,第二阶段的实践。
我对自己使用BPF优化网络这个领域有兴趣,所以成为了我学习的切入点。以下是我第一个网络级别XDPBPF的程序。
(0101010131)
(010102)
r0保存调用辅助函数后的返回值。
r1–r5保存了从程序到辅助函数的参数列表。
r6–r9是用于保存可以由多个辅助函数调用的中间值的寄存器。
r10是包括访问BPF 技术stack的指针的唯一只读寄存器。
再共享一些关于读取代码方法的TIpS。
快速定位函数的定义和参照
下载代码,编译运行BPF程序示例
按照示例性程序,写下自己的BPF程序并执行
分享最后学习BPF带来的收获:
(01010133)
冷静下来Linux内核可以看代码。这个听起来不简单。不容易。有学习的兴趣,有学习的目标。我习惯了读很长很难的代码。
理解系统调用、文件系统等功能模块的动作原理,能够安静地阅读代码,所以一辈子都不知道的东西,渐渐清晰了起来。
本站声明:本站所有好东西均来源于互联网,不保证100%完整、不提供任何技术支持,分享目的仅限于学习和测试,一切商业行为与本站无关,下载后请在24小时内删除。请勿用于商业用途,如需商业使用请向官方购买授权,由于使用该资源引起的侵权行为与本站无关!如有侵权,请联系info#sogua2008.com(将#换为@)及时删除!
本文地址:搜刮好东西 » Linux超能力BPF共享技术介绍和学习