主页 topics eBPF 什么是 eBPF?
探索 IBM Instana Observability
表示操作系统活动的抽象设计
什么是 eBPF?

扩展伯克利数据包过滤器 (eBPF) 编程技术可以帮助开发人员编写高效、安全、非侵入且直接在 Linux 操作系统 (OS) 内核空间中运行的程序。

eBPF 因为可以在特权上下文(如操作系统内核)中运行沙盒程序,所有能够在运行时扩展现有软件的功能,而无需修改内核源代码、加载内核模块或中断整个程序执行。eBPF 技术代表了原始伯克利数据包过滤器 (BPF) 的演变。BPF 提供了一种在用户空间程序中选择和分析网络数据包的简单方法;但除数据包过滤之外,BPF 程序缺乏处理内核内更复杂任务的灵活性。

为响应对更通用技术的需求,Linux 社区基于 BPF 的后端功能构建了 eBPF,但扩展了 BPF 内核内可编程性。借助 eBPF 程序的高级功能,开发人员能在现场数据中心和云原生环境中实施增强的数据包过滤进程、进行高端性能分析以及安装防火墙和调试协议。

eBPF 技术的进步迫使软件开发人员将应用程序扩展到所有操作系统,以便非基于 Linux 的平台可以利用 eBPF 复杂的跟踪、网络和监控功能。1事实上,eBPF 基金会(Linux 基金会的延伸,成员包括 Google、Meta、Netflix、Microsoft、Intel 和 Isovalent 等)已大力投资扩展 eBPF 程序的操作系统兼容性,希望最终扩大 eBPF 编程的应用范围。2

请求 Instana 演示

获取 IBM Instana Observability 演示,了解如何在几分钟内实现全栈可观察性和监控。

相关内容

订阅 IBM 时事通讯

eBPF 程序的组件

eBPF 程序的主要组件:

eBPF 字节码

eBPF 程序最初用受限的 C 子集编写,然后用 LLVM 等工具编译为 eBPF 字节码,LLVM 充当 Clang 等前端编程语言的 eBPF 后端架构。 字节码本质上是一组受限指令,遵循 eBPF 指令集架构并防止运行时错误。

eBPF 解释器/JIT 编译器

Linux 内核技术能够将 eBPF 字节码翻译为可执行操作,不过即时 (JIT) 编译器可提供卓越的性能。JIT 编译器可以将字节码即时翻译为特定硬件平台本机机器码。

用户空间加载器

用户空间加载器是用户空间中的程序,将 eBPF 字节码加载到内核,从而将字节码附加到适当的钩子并管理任何关联的 eBPF 映射。用户空间加载器的示例包括 BPF Compiler Collection (BCC) 和 bpftrace 等工具。

eBPF 地图

eBPF 地图是具有键值对和读写访问权限的数据结构,提供共享存储空间并促进 eBPF 内核程序和用户空间应用程序之间的交互。eBPF 地图使用系统调用创建和管理,还可维护 eBPF 程序的不同迭代之间的状态。

eBPF 验证器

验证器(eBPF 系统的关键组件)在字节码加载到内核之前检查字节码,确保程序不包含任何有害操作,例如无限循环、非法指令或越界内存访问。它还确保程序的所有数据路径成功终止。

eBPF 钩子

钩子是内核代码中可以连接 eBPF 程序的点。当内核到达钩子时,它会执行附加的 eBPF 程序。

不同类型的钩子(如跟踪点、kprobes 和网络数据包接收队列)为 eBPF 程序提供广泛的数据访问权限,支持程序执行各种操作。例如,跟踪点支持程序检查和收集有关内核或其他进程的数据,而流量控制钩子可用于检查和修改网络数据包。

辅助函数

因为 eBPF 无法生成任意函数且必须保持与每个可能内核版本的兼容性,因此有时基本的 eBPF 指令集不够细致,无法执行高级操作。辅助函数弥补了这一差距。

辅助函数(eBPF 可以从系统内部调用的一组预定义的、基于API 的内核函数)让 eBPF 程序可以执行不受指令集直接支持的复杂操作(例如获取当前时间和日期或生成随机数)。

eBPF 的工作原理

一般来说,eBPF 在 Linux 内核中作为虚拟机(VM) 运行,在低级指令集架构上工作并执行 eBPF 字节码。但是,执行 eBPF 程序的复杂过程往往遵循某些主要步骤。

开发人员首先编写 eBPF 程序并编译字节码。程序的目的将决定对应代码类型。例如,想要监控 CPU 使用情况的团队将编写包含捕获使用指标功能的代码。

一旦 eBPF 编译器将高级 C 代码转换为低级字节码,用户空间加载器将生成 BPF 系统调用,从而将程序加载到内核中。加载器还负责解决错误并设置程序所需的任何 eBPF 地图。

程序字节码和映射就位后,eBPF 执行验证过程,确保程序在内核中安全执行。如果程序被认为不安全,则加载程序的系统调用将失败,并且加载程序将收到错误消息。如果程序通过验证,则允许运行。

eBPF 使用解释器或 JIT 编译器将字节码转换为可操作的机器码。eBPF 是一种事件驱动技术,只响应内核内的特定钩子点或事件(例如,系统调用、网络事件、进程启动、CPU 空闲等)而运行。当事件发生时,eBPF 执行相应的字节码程序,从而允许开发人员检查和操作系统的各种组件。

一旦 eBPF 程序运行,开发人员就可以使用 eBPF 地图从用户空间与程序交互。例如,应用程序可能会定期检查地图以从 eBPF 程序收集数据,或者更新地图以更改程序的行为。

卸载程序是大多数 eBPF 执行过程的最后一步。当 eBPF 完成工作后,加载器可以再次使用 BPF 系统调用将其从内核中卸载,此时 eBPF 停止运行并释放相关资源。卸载过程还可能包括迭代团队不再需要的 eBPF 地图,以释放有用的单个元素,然后删除地图本身(使用“删除”系统调用)。

eBPF 用例和优势

eBPF 技术已经成为现代 Linux 系统的基石,实现对 Linux 内核的细粒度控制,并使企业能够在 Linux 生态系统中构建更创新的解决方案。

eBPF 促进了以下方面的进步:

联网

eBPF 允许开发人员安装速度更快、定制程度更高的数据包处理功能、负载均衡过程、应用程序分析脚本和网络监控实践。Cilium 等开源平台利用 eBPF 为 Kubernetes 集群和工作负载以及其他容器化微服务提供安全、可扩展的网络。此外,eBPF 利用内核级包转发逻辑,还可以简化路由流程并加快整体网络响应。

可观察性

eBPF 使开发人员能够向内核和用户空间应用程序插入代码或工具,以收集详细的性能数据和指标,而不会显著影响系统性能。这些功能可帮助组织保持领先地位,实现实时监控和可观察性

安全

eBPF 可以监控系统调用、网络流量和系统行为,实时检测和响应潜在的安全威胁。例如,Falco 等 IT 解决方案使用 eBPF 来实现运行时安全审计和事件响应,从而增强系统的整体安全性。

性能微调

eBPF 通过跟踪系统调用、监控 CPU 利用率和跟踪资源利用率(如磁盘 I/O) 可以帮助开发人员轻松发现系统性能瓶颈并识别优化机会。

相关解决方案
IBM Instana Observability 新一代应用性能管理平台

IBM Instana 通过提供一个解决方案来实现可观察性的普及化,DevOps、SRE、平台、ITOps 和开发领域的任何人都可以使用该解决方案在所需的环境中获取所需的数据。该平台专为云原生而构建,但与技术无关,支持以 1 秒的粒度自动且连续地提供高保真数据,并在移动、网络、应用程序和基础架构的逻辑和物理依赖关系环境中进行端到端跟踪。

探索 Instana 请求 Instana 演示

IBM Turbonomic

可以利用 IBM Turbonomic 混合云成本优化平台,持续实时地自动执行关键操作,从而主动为堆栈每一层的应用程序提供最有效的计算、存储和网络资源。

探索 Turbonomic 免费试用 Turbonomic
采取后续步骤

IBM Instana 提供人人都能使用的实时可观察性。它可以快速实现价值,同时确保您的可观察性策略能够跟上当今和未来环境的动态复杂性。从移动设备到大型机,Instana 支持超过 250 种技术,并且还在不断增加。

探索 IBM Instana 预约实时演示
脚注

1 基金会提议推动在多个操作系统上推广 eBPF 的采用(ibm.com 外部链接),DevOps.com,2021 年 8 月 21 日

2最新的 eBPF 进步是 IT 重大变革的先兆(ibm.com 外部链接),Devops.com,2023 年 9 月 13 日