《架构师》2023年6月
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

颠覆传统、应用大爆发,eBPF何以改变Linux?

作者 凌敏

eBPF毫无疑问是当下最火的技术之一。2014年,eBPF首次出现在Linux内核中。经过社区不断迭代,目前,eBPF在技术上已经成熟,并在故障诊断、网络优化、安全控制、性能监控等领域获得大量应用,项目数量呈爆炸式增长。在此前的采访中,有不少受访专家对InfoQ表示,eBPF的发展前景广阔,属于eBPF的时代已经来临。

那么,eBPF技术到底为Linux带来了哪些改变?为什么近几年突然爆火?国内外发展和落地情况如何?如何预防和处理eBPF带来的安全问题?近期,InfoQ采访了西安邮电大学教授、龙蜥社区eBPF技术探索SIG Owner陈莉君教授,以期进一步了解eBPF技术特性以及应用实践。

从BPF到eBPF

InfoQ:eBPF是从BPF技术扩展而来的,您能简要介绍下它的发展历程吗?

陈莉君教授:最早可以追溯到1992年。在1992年USENIX会议上,论文“The BSD Packet Filter: A New Architecture for User-level Packet Capture”提出了革命性的包过滤机制BSD Packet Filter(简称为BPF),这比当时最先进的数据包过滤技术还快20倍。这主要得益于BPF的两大设计:第一,内核态引入一个新的虚拟机,所有指令都在内核虚拟机中运行;第二,用户态使用BPF字节码来定义过滤表达式,然后传递给内核,由内核虚拟机解释执行。

在Linux 2.1.75中,首次引入了BPF技术。在Linux 3.0中,增加了BPF即时编译器,它替换掉了原本性能更差的解释器,进一步优化了BPF指令运行的效率。

2014年,Alexei Starovoitov将BPF扩展为一个通用的虚拟机,也就是eBPF。eBPF不仅扩展了寄存器的数量,引入了全新的BPF映射存储,还在4.x内核中将原本单一的数据包过滤事件逐步扩展到了内核态函数、用户态函数、跟踪点、性能事件(perf_events)以及安全控制等。

eBPF的诞生是BPF技术的一个转折点,使得BPF不再仅限于网络栈,而是成为内核的一个顶级子系统。

具体来看,eBPF有以下几个重要特性:

• 性能优化:eBPF允许在内核空间运行用户空间代码,它可以实现很多低级别的操作,而且执行速度非常快。

• 安全:它可以限制程序执行的内存和CPU资源,防止恶意程序占用系统资源或对系统造成危害。

• 功能丰富:支持网络数据包过滤、路由、负载均衡、跟踪、性能分析等,这使得它能够在很多领域得到应用。

• 开源社区的力量:随着eBPF功能的不断扩展,开源社区的开发者和用户也在不断增加,这为eBPF的发展创造了很多机会。

InfoQ:为什么eBPF在近几年突然火了起来?背后有哪些因素助推?

陈莉君教授:eBPF近几年爆火的背后,有以下几个因素助推:

• eBPF技术本身具有的优越性,能够给内核带来性能提升、扩展性、安全性等。

• 越来越多的SaaS平台和应用程序的出现,需要实时监控和调优,而eBPF的实时性能分析可以很好的满足此类需求。

• eBPF提供了一种新的灵活性,可以集中地管理和监控大量服务。这使得系统运维人员更容易应对许多运维问题,而不需要花费大量的时间进行调查和调整。

• eBPF可以收集、分析、运用巨量数据,为公司提供可视化的监控和预测,这将带来前所未有的管理优势。

• 云计算和容器化计算技术的普及,使得eBPF可以与容器技术紧密结合,更方便的收集容器内的性能和状态数据;

• 谷歌和其他巨头公司使用eBPF作为它们的跟踪技术和监控解决方案,这给它赋予了更大的价值和关注度。

eBPF如何改变Linux?

InfoQ:作为一项革命性的技术,eBPF为Linux带来了哪些改变?它是如何工作的?

陈莉君教授:eBPF在Linux中有多项改变,如提高内核灵活性,可以在不需要重新编译内核的情况下实现系统功能的快速修改和扩展;改善安全性,eBPF应用可以进行精确的安全检查,从而提供更好的内核安全性,以及检测和防止内核攻击;改善性能,eBPF允许开发者构建内核性能数据采集程序,从而使内核性能数据采集变得更加简单,可用于检测内核性能问题,如异常、调试、性能分析等。

eBPF是Linux内核中软件实现的虚拟机,其工作原理是:用户把eBPF程序编译为eBPF指令,然后通过bpf()系统调用将eBPF指令加载到内核的特定挂载点,由特定的事件来触发eBPF指令的执行。在挂载eBPF指令时内核会进行充分验证,避免eBPF代码影响内核的安全和稳定性。另外内核也会进行JIT编译,把eBPF指令翻译为本地指令,减少性能开销。

内核在网络处理路径上中预置了很多eBPF的挂载点,例如xdp、qdisc、tcp-bpf、socket等。eBPF程序可以加载到这些挂载点,并调用内核提供的特定helper函数来修改和控制网络报文。eBPF程序可以通过map数据结构来保存和交换数据。

InfoQ:目前eBPF主要有哪些成熟的应用场景?

陈莉君教授:eBPF的性能和稳定性使它成为一种非常强大的内核性能调优工具,它的主要应用场景有:

• 网络跟踪:eBPF可以让用户在内核中捕获和分析数据包,从而对网络进行性能跟踪。

• 性能监控:eBPF可以通过实时监控系统性能数据(如CPU利用率、内存使用情况等),帮助用户诊断和解决系统问题。

• 系统安全:eBPF可以用于实现防火墙规则、安全监控等安全功能。

• 资源分配:eBPF可以用于动态分配系统资源,例如根据网络流量动态调整网络缓冲区大小。

• 网络优化:eBPF可以用于实现网络优化,例如通过读取TCP连接信息来调整TCP参数以提高网络性能,还有实现负载均衡、容器网络管理等。

InfoQ:国内外eBPF技术发展和落地情况如何?有哪些值得关注的开源项目?

陈莉君教授:在国内外,eBPF得到了快速发展,尤其是在网络领域,它已经被广泛应用于各种网络设备、操作系统、容器平台、SDN以及NFV等领域。

eBPF的开源项目,最典型的就是iovisor带来的BCC、bpftrace等工具,成为eBPF在跟踪和诊断领域的最佳实践。Cilium、Katran、Falco等一系列基于eBPF优化网络和安全的开源项目也逐步诞生。最流行的网络解决方案之一Calico,就在最近的版本中引入了eBPF数据面网络,大大提升了网络的性能。

开发者可以重点关注以下开源项目:

• BCC:BCC是一种开源的eBPF文件工具集,可以帮助开发者创建、分析和调试系统性能监控工具。BCC还提供比Tcpdump和iptables更强大的数据包处理能力。

• Cilium:用于透明地保护容器应用之间的网络连接。Cilium基于eBPF技术开发,因此集成了eBPF的大部分特性和优点,提供负载均衡和监控、排障等非常多的功能。

• Falco:可以实现对调用行为的监控,并依赖于强大的规则引擎,对异常的系统调用行为进行告警。

• Coolbpf:以CO-RE(Compile Once--Run Everywhere)为基础实现,保留了资源占用低、可移植性强等优点,还融合了BCC动态编译的特性,适合在生产环境批量部署应用。支持在同一个eBPF程序,运行在5.x、4.x,甚至3.10的内核上。

• LMP项目:LMP(Linux显微镜)基于eBPF探索和孵化更多的创新项目,形成对Linux内核深入探索和细粒度观察,给初学者探索和学习提供一种项目超市。

InfoQ:由您领衔成立了业界首个产学研eBPF技术探索SIG,这个SIG组成立的初衷是什么?目前取得了哪些研究进展?

陈莉君教授:eBPF技术探索SIG致力于深入研究分析BPF前沿技术和产学研界发展,增强Networking、Tracing、Observability、Security四个纬度技术深度和落地效果,打造国内最有影响力的BPF项目和社区。SIG成立的初衷是推动eBPF技术在国内的应用和发展,做国内领先者社区,国际上协同和对标eBPF知名社区。通过技术创新和技术合作,降低eBPF的学习和使用门槛,为高校师生、eBPF技术爱好者、Linux从业者提供工具和平台,打造创新的eBPF技术落地到Linux内核社区。

eBPF技术探索SIG在以下几方面取得了不错的进展:

• 首届eBPF中国研讨会诞生:为广大eBPF爱好者提供了交流平台和前沿技术分享机会,各类开源项目集中亮相,为eBPF技术在国内的发展提供了无限可能。

• 云栖大会龙蜥操作系统峰会eBPF专场活动举行:线下参与技术讨论,助力eBPF技术的蓬勃发展。

• 社区项目Coolbpf和Eunomia的结合,进一步推动低门槛和易部署的eBPF技术落地,同时eBPF和WASM技术的融合成果得到了落地,编写和运行eBPF代码将变得轻而易举。

• 提出远程编译和本地编译的容器服务,以及低版本内核支持eBPF的能力,让使用者更加专注自身eBPF功能开发,不必关注编译和执行环境的复杂性。即将推出轻量级BPF字节码生成方式,让Coolbpf也支持脚本化的方式运行,却不必安装LLVM/Clang编译依赖库。

• Linux显微镜(LMP)项目在现有基于eBPF的20多个相关工具基础上,探索和孵化更多的eBPF创新项目、相关工具;继续深入产学研融合,进一步完善ORAS和OCI镜像相关的支持;重构并迁移现有的eBPF工具,提供完整的、开箱即用的分析工具组件;在eBPF开发积累的过程中,开发eBPF相关通用组件,在进程调度和文件系统方面,落地基于eBPF的Linux内核微内核化。

InfoQ:下一步,龙蜥社区eBPF技术探索SIG有哪些探索和发展规划?

陈莉君教授:龙蜥社区eBPF技术探索SIG将进一步致力于eBPF前沿技术的研究,以及把eBPF这项技术更多的应用于高校师生、eBPF技术爱好者,降低学习和入门难度,以及部署的简易化。

• 将eBPF与其他技术(如微服务)集成,以便在复杂的应用场景中获得更佳的效果,在可观测领域有更多工具和平台涌现。

• 实现更加高效和简洁的eBPF编译器,不需要安装太多的依赖库。

• 针对内核领域,更多功能进行eBPF定制,如路由、Netfilter、流量管理等功能。

• 开发一些易于使用的eBPF工具,以便用户更好地理解和使用eBPF技术。

• WASM和eBPF两个应用生态进一步完美结合。

SIG将通过双周会的形式,定期和大家汇报eBPF领域和Linux内核领域当前国内外的研究热点和技术新闻;通过线上线下分享的形式,保持技术领先性和持续关注度;通过线下Meetup或者峰会的形式,拉进SIG成员的距离,形成良好的共同探讨技术的氛围。

如何预防和处理eBPF带来的安全问题?

InfoQ:eBPF是万能的吗?它存在哪些限制?是否也会给开发者带来一些相应的挑战?

陈莉君教授:eBPF虽然强大,但不是万能的,同开发普通的应用程序相比,它存在着很多的限制,往往会给开发者带来一定的不便。比如,eBPF指令集有限,这意味着它没有办法去完成某些复杂的任务,如复杂的字符串处理、循环等;eBPF栈空间大小有限,而且只有512字节,带来了开发上的不便;eBPF能够调用的函数比较有限,只能调用内核提供的helper函数,无法像开发其它应用程序一样任意地调用三方库;eBPF程序调试功能较弱,导致无法快速定位编写程序时出现的bug。

InfoQ:eBPF带来的安全问题同样值得关注,比如会有恶意程序利用eBPF进行伪装,对于这种可能会发生安全事件,我们应当如何预防和解决呢?

陈莉君教授:eBPF作为内核技术,具有很高的权限和扩展性,因此也需要相应的安全措施。一些常见的安全威胁包括:恶意代码执行,通过构造恶意的eBPF程序,可以在内核环境中执行任意代码,这是一个严重的安全问题;数据泄露,不当的eBPF程序可能会泄露系统敏感信息,这包括内存中的数据和网络流量;内存损坏:eBPF程序可以直接访问内存,如果程序不正确,可能导致内存损坏,导致系统崩溃。

为了预防和处理这些威胁,应该采取以下措施:

对eBPF程序进行审核:在加载eBPF程序之前,应该对其进行审核,确保它是安全的。eBPF的verifier一直在做更多的权衡和考虑,对程序进行安全校验。

限制eBPF程序的权限:应该通过使用eBPF的安全模型,限制eBPF程序的权限,例如,限制它只能读取特定的数据。

使用沙盒技术:使用沙盒技术,隔离eBPF程序,防止它对系统造成危害。

实施监控:通过实施监控,监测eBPF程序的行为。

开发者如何更好地学习eBPF技术?

InfoQ:对于开发者来说,如何才能更好地学习eBPF?

陈莉君教授:首先要掌握Linux系统操作系统知识,再了解eBPF的大概原理,它是一种Linux内核可扩展性技术,它允许用户探索系统行为,以便在内核中运行自己的程序。此外,还要了解eBPF的关键概念,包括BPF程序、套接字程序、文件和目录程序、日志程序、安全程序、跟踪程序、XDP程序,等等。

熟悉eBPF的编程语言,eBPF程序使用C来编写(用户空间程序可以采用Go、Rust等语言),并且可以通过用户空间库调用它们的特定功能。可以使用LLVM、clang、gcc等编译器来编译eBPF程序。目前,龙蜥社区推出的Coolbpf项目,可以简化这部分的开发工作。

了解eBPF调试工具,例如BCC/bpftrace,Kprobes、bpftool等,这些工具可以帮助开发者在使用eBPF时开发和调试程序。

根据开发者自身的情况,选择合适的eBPF程序,然后开始学习并编写自己的eBPF程序。此外,还可以查看其他开发者的代码,以便获得更多的灵感。

InfoQ:Linux得以成功的关键是什么?今年有哪些值得关注的Linux及eBPF动态?

陈莉君教授:Linux得以成功,主要得益于其开源自由、社区参与贡献、技术性能与安全性能兼备的特点。此外,Linux发展在中国也吸引了众多行业领域的参与,形成了一个良好的生态环境,这也是其成功的重要原因。

值得关注的一些Linux及eBPF动态:

• Linux支持eBPF调度策略的定制。eBPF调度策略系列补丁将会进一步提升这个功能的稳定性,预计今年会有比较多的实际应用呈现。通过编写(e)BPF程序对Linux内核的任务调度决策进行定制可以帮助开发人员更快地试验和探索新的调度策略,使得内核的调度策略更贴近实际应用的需要。

• eBPF社区和WASM社区的融合:目前国内有很多项目在做这两个技术的融合,例如Eunomia的wasm-bpf项目。

• 开源AI和机器学习热度继续:更多开源AI和机器学习工具和项目的发展,以满足对这些技术的需求。ChatGPT风靡全球,更多的企业和个人投入到机器学习和人工智能大潮中,加速更多平台和新的项目推出和演进,也将使Linux进一步得到加速和深度应用。

• 云原生和可观测技术兴起:云原生技术的发展对Linux内核技术和eBPF技术具有很大的推动作用,基于eBPF的无侵入机制应用在可观测领域,具有非常大的想象空间。