Linux eBPF介绍(一)

文章目录

  • 一、什么是eBPF
  • 二、为什么要用eBPF
  • 三、eBPF有哪些用途
  • 四、eBPF的限制
    • 参考链接

该系列文章主要参考倪朋飞老师 《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)