eBPF 基础

BPF

BPF 概述

BPF 最初代表伯克利包过滤器 (Berkeley Packet Filter)是基于寄存器的虚拟机运行于内核空间,能够在linux内核内部运行即时本地编译的BPF程序,允许以安全的方式在各种挂钩点执行字节码。它被用于许多Linux 内核子系统,最突出的是网络、跟踪和安全(例如沙箱)。
最初的 BPF 有时被称为 cBPF(classic BPF)。
BPF 最初因tcpdump而知名,如今,Linux 内核仅运行 eBPF,加载的 cBPF 字节码在程序执行之前会在内核中透明地转换为 eBPF 表示形式。

BPF 结构图

eBPF 概述

eBPF,即“extended BPF”,针对现代硬件进行了优化,较之BPF执行速度更快。它可以在特权上下文中(如操作系统内核)运行沙盒程序。通过允许在操作系统中运行沙盒程序的方式,应用程序开发人员可以运行 eBPF 程序,以便在运行时向操作系统添加额外的功能。然后在 JIT 编译器和验证引擎的帮助下,操作系统确保它像本地编译的程序一样具备安全性和执行效率。

eBPF Hook

eBPF 程序是事件驱动的,当内核或应用程序通过某个钩子点时运行。预定义的钩子包括系统调用、函数入口/退出、内核跟踪点、网络事件等。

eBPF 架构图

eBPF 工作逻辑

eBPF 用途

如今,eBPF 被广泛用于驱动各种用例:在现代数据中心和云原生环境中提供高性能网络和负载均衡,以低开销提取细粒度的安全可观测性数据,帮助应用程序开发人员跟踪应用程序,为性能故障排查、预防性的安全策略执行(包括应用层和容器运行时)提供洞察,等等。

XDP

XDP 全称为 eXpress Data Path,提供了 BPF 框架,可在 Linux 内核中实现高性能可编程数据包处理。它在网络驱动程序收到数据包时运行 BPF 程序。
Linux内核中基于eBPF提供的高性能数据路径,驱动程序只是从其接收环中拾取数据包,而没有执行任何昂贵的操作。无须处理上下文切换、中断等,可大大减少内核开销。

eBPF 和 XDP 

XDP 和 eBPF 可以在内核数据路径中实现高性能的数据包处理。XDP 允许我们将 eBPF 程序附加到内核内的低级挂钩。由网络驱动程序实现的 XDP 挂钩在 Linux 网络堆栈之前提供了一个可编程层。
当数据包到达时,网络驱动程序执行主 XDP 挂钩中的 eBPF 程序。该框架允许我们在从硬件接收到数据包后尽早执行自定义 eBPF 程序,从而确保超高性能。一些智能网卡还支持卸载XDP,这使得程序可以在网卡上运行,而无需以任何方式使用主机CPU。

参考文档

https://ebpf.io/zh-cn/what-is-ebpf/

https://docs.cilium.io/en/stable/bpf/#bpf-guide

posted @ 2023-12-28 10:27  小吉猫  阅读(18)  评论(0编辑  收藏  举报