Linux eBPF介绍(一)

本文介绍了eBPF,一种强大的内核技术,它可以用于网络监控、安全过滤、性能分析和虚拟化。文章详细讲述了eBPF的起源、优势以及其在实际场景中的应用,同时也提到了eBPF的限制和内核版本的要求。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


该系列文章主要参考倪朋飞老师 《eBPF核心技术与实战》


一、什么是eBPF

eBPF(extened Berkeley Packet Filter)是一种内核技术,它允许开发人员在不修改内核代码的情况下运行特定的功能。eBPF 的概念源自于 Berkeley Packet Filter(BPF),后者是由贝尔实验室开发的一种网络过滤器,可以捕获和过滤网络数据包。2014 年eBPF 随 Linux 3.18 首次限量发布,充分利用 eBPF 至少需要 Linux 4.4 以上版本。

二、为什么要用eBPF

在 eBPF 之前,内核模块是注入内核的最主要机制。由于缺乏对内核模块的安全控制,内核的基本功能很容易被一个有缺陷的内核模块破坏。而 eBPF 则借助即时编译器(JIT),在内核中运行了一个虚拟机,保证只有被验证安全的 eBPF 指令才会被内核执行。同时,因为 eBPF 指令依然运行在内核中,无需向用户态复制数据,这就大大提高了事件处理的效率。

三、eBPF有哪些用途

eBPF 是一种非常灵活和强大的内核技术,可以用于多种应用场景。下面是 eBPF 的一些常见用途:

  • 网络监控:eBPF 可以用于捕获网络数据包,并执行特定的逻辑来分析网络流量。例如,可以使用 eBPF 程序来监控网络流量,并在发现异常流量时进行警报。
  • 安全过滤:eBPF 可以用于对网络数据包进行安全过滤。例如,可以使用 eBPF 程序来阻止恶意流量的传播,或者在发现恶意流量时对其进行拦截。
  • 性能分析:eBPF 可以用于对内核的性能进行分析。例如,可以使用 eBPF 程序来收集内核的性能指标,并通过特定的接口将其可视化。这样,可以更好地了解内核的性能瓶颈,并进行优化。
  • 虚拟化:eBPF 可以用于虚拟化技术。例如,可以使用 eBPF 程序来收集虚拟机的性能指标,并进行负载均衡。这样,可以更好地利用虚拟化环境的资源,提高系统的性能和稳定性。

总之,eBPF 的常见用途非常广泛,可以用于网络监控、安全过滤、性能分析和虚拟化等多种应用场景。

四、eBPF的限制

下面是一些最常见的 eBPF 限制:

  1. eBPF 程序必须被验证器校验通过后才能执行,且不能包含无法到达的指令;
  2. eBPF 程序不能随意调用内核函数,只能调用在 API 中定义的辅助函数;
  3. eBPF 程序栈空间最多只有 512 字节,想要更大的存储,就必须要借助映射存储;
  4. 在内核 5.2 之前,eBPF 字节码最多只支持 4096 条指令,而 5.2 内核把这个限制提高到了 100 万条;
  5. 由于内核的快速变化,在不同版本内核中运行时,需要访问内核数据结构的 eBPF 程序很可能需要调整源码,并重新编译。
    此外,虽然 Linux 内核很早就已经支持了 eBPF,但很多新特性都是在 4.x 版本中逐步增加的,具体你可以看下这个链接。所以,想要稳定运行 eBPF 程序,内核版本至少需要 4.9 或者更新。而在开发和学习 eBPF 时,为了体验最新的 eBPF 特性,我推荐使用更新的 5.x 内核。

这里摘抄一份评论作为参考

”曾基于 BPF 做过一个容器平台的链路追踪系统,分解出单个请求在服务端经过的节点、网络设备、耗时等信息,便于快速定位网络抖动时主要延迟的具体发生点。 遇到最多的是内核版本差异引起的各类编译问题,要么跑不起来,要么运行结果不符合预期。尤其 4.9 内核问题很多,5.x 版本的内核自己在测试环境用一用还行,线上的内核版本相对会保守,几年前 3.10 的占比很高。不过好消息是,新机器的内核一般都直接使用 4.x,甚至 5.x。BPF 落地生产环境的环境阻力小了很多。 如果公司的环境暂时还不能应用 BPF 技术,不妨碍先进行知识储备,自己先玩起来,等到真正被需要的时候就可以发挥作用了。“

参考链接

  1. EBPF 介绍
### Linux eBPF 使用教程与案例 #### 什么是eBPFeBPF(Extended Berkeley Packet Filter)是项允许在Linux内核中运行沙盒程序的技术,这些程序可以在特定事件发生时执行而不会影响系统的稳定性或安全性[^2]。 #### 安装bcc工具集 对于希望快速上手并利用现成工具来探索eBPF功能的人来说,安装`bcc`是个不错的选择。这是个基于Linux eBPF的新代网络分析工具集合,适用于性能监控、网络跟踪以及安全分析等多个领域。可以通过访问项目主页获取更多详情和安装指南[^1]: ```bash pip install bcc ``` #### Go语言开发eBPF入门 如果倾向于使用Go语言进行eBPF应用的构建,则可以从官方文档开始学习如何设置环境,并编写简单的eBPF程序。这不仅限于理论介绍,还包括实际操作指导,帮助开发者掌握必要的技能: - **第步**: 获取所需的依赖项和其他资源。 - **第二步**: 编写用户空间应用程序接口(API),用于配置和管理内核中的eBPF代码。 #### 实践案例:HTTP流量控制 为了更直观地理解eBPF的应用场景,考虑个具体的例子——基于TC(Traffic Control)机制实现HTTP请求过滤的功能。此过程中涉及到内核态C代码编写及用户态Go代码交互的设计思路[^3]。 ##### 用户态Go文件示例: ```go package main import ( "fmt" ebpf "github.com/cilium/ebpf" ) func main() { // 加载已编译好的eBPF对象文件 obj, err := ebpf.LoadCollectionSpec("http_filter.bpf.o") if err != nil { fmt.Printf("Failed to load BPF object: %v\n", err) return } } ``` #### 构建支持eBPF的静态库 当需要将多个eBPF组件集成到更大的软件系统中时,创建个包含常用函数和支持结构的静态库(`libbpf.a`)会很有帮助。下面展示了怎样从源码树下提取必要部分并打包为静态库[^4]: ```bash cd /path/to/kernel/source/tools/lib/bpf/ sudo ar rcs libbpf.a *.o ``` #### 性能优化技巧 针对某些具体应用场景下的性能瓶颈问题,比如频繁读写的I/O密集型任务,可以借助eBPF捕获感兴趣的文件描述符活动,并进步挖掘潜在的调优机会。例如,通过关联socket信息来追踪TCP连接状态变化等[^5]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值