1. 为什么要学习 BPF

可以先从 ebpf.io 网站获取一个简单的了解,首页内容翻译如下。

Linux 内核一直是实现监控/可观察性、网络和安全性的理想场所。不幸的是,这往往是不切实际的,因为它需要改变内核源代码或加载内核模块,并导致层层抽象叠加。eBPF 是一项革命性的技术,它可以在 Linux 内核中运行沙盒程序,而无需改变内核源代码或加载内核模块。

通过使Linux内核可编程,基础架构软件可以利用现有的层,使其更加智能,功能更加丰富,而不会继续给系统增加额外的复杂度,也不会影响执行效率和安全性。

eBPF 开发了全新一代的软件,能够对 Linux 内核的行为进行重新编程,甚至在传统上完全独立的多个子系统中应用逻辑。

bpf_arch

BPF 技术目前主要用于以下场景:

  1. 追踪和性能分析(Tracing & Profiling)

    将 eBPF 程序附加到跟踪点以及内核和用户应用探针点的能力,使得应用程序和系统本身的运行时行为具有前所未有的可见性。通过赋予应用程序和系统两方面的检测能力,可以将两种视图结合起来,从而获得强大而独特的洞察力来排除系统性能问题。先进的统计数据结构允许以高效的方式提取有意义的可见性数据,而不需要像类似系统那样,通常需要导出大量的采样数据。

  2. 观测和监控(Obervability & Monitoring)

    eBPF 不依赖于操作系统暴露的静态计数器和测量,而是实现了自定义指标的收集和内核内聚合,并基于广泛的可能来源生成可见性事件。这扩展了实现的可见性深度,并通过只收集所需的可见性数据,以及在事件源处生成直方图和类似的数据结构,而不是依赖样本的导出,大大降低了整体系统的开销。

  3. 网络(Network)

    可编程性和效率的结合使得 eBPF 自然而然地满足了网络解决方案的所有数据包处理要求。eBPF 的可编程性使其能够在不离开 Linux内核的包处理上下文的情况下,添加额外的协议解析器,并轻松编程任何转发逻辑以满足不断变化的需求。JIT 编译器提供的效率使其执行性能接近于本地编译的内核代码。

  4. 安全(Security)

    在看到和理解所有系统调用的基础上,将其与所有网络操作的数据包和套接字级视图相结合,可以采用革命性的新方法来确保系统的安全。虽然系统调用过滤、网络级过滤和进程上下文跟踪等方面通常由完全独立的系统处理,但 eBPF 允许将所有方面的可视性和控制结合起来,以创建在更多上下文上运行的、具有更好控制水平的安全系统。

在追踪方面细分为了两类:

  • 追踪和性能分析
  • 观测和监控

这两者的区别主要在于数据的搜集和聚合是否在内测层面进行的,观测和监控主要是侧重于在内核导出指标、直方图或相关事件。

bpf_cls_trace bpf_cls_monitor
bpf_cls_network bpf_cls_security

BPF 技术的整体介绍请参见 eBPF 结束简介

2. BPF 应该怎么学习

2.1 BPF 书籍

2.1.1 书籍介绍

如果是想系统学习 BPF 技术,我的建议是先阅读相关的书籍,得到一个整体的认识,然后分方向单独深入。

目前 BPF 的书籍主要有以下两本:

2.1.2 图书心得

  • 《Linux Observability with BPF》

    中文和英文版都在 180 页左右,整体的思路清晰,相关的技术面面俱到,如果定位是整体理解(而不是实践练习),整本书阅读一天内可以完成,能够实现快速对于 BPF 技术的整体了解,但是本书对于涉及的内容介绍基本上还是停留在基础知识介绍,基本上无深入知识介绍,作为入门级别的书籍再合适不过。主要内容包括以下方面:

    • BPF 基础知识
      • BPF 的历史及架构;
      • BPF 的程序类型和验证器:按照重要性依次介绍了各种程序类型;
      • BPF Map: BPF Map 类型,常见操作和以及 Map 相关虚拟系统;
    • BPF Trace
      • BPF Trace:Trace 的基础知识(kprobe、tracepoint、usdt等)和几个 BCC 使用的样例;
      • BPF 相关工具(BPFTool & BPFTrace & kubectl-trace & eBPF Exportor);
    • BPF Network
      • Linux 网络和 BPF:涵盖数据包过滤和 cls_bpf 相关内容;
      • XDP:由于 XDP 在网络数据处理的特殊地位,单独成章,对于 XDP 进行了简单介绍和一个简单的原理实现,以及如何使用 BCC 进行 XDP 相关的验证;
    • 安全
      • 主要是 Seccomp(基于传统的 cBPF)和 LSM 钩子两个方面的内容,主要是简单的介绍,内容不多;
    • 真实的用户案例
      • 国外几大公司 Sysdig 、Floowmill 等在 BPF 的技术实践。
  • 《BPF Performance Tools》

    本书英文版 839 页,主要涉及的 BPF 技术的基础、BPF Trace 基础基础知识、BPF 技术 Trace 方面的各种实践本书无 BPF 在网络、安全上的详细介绍。本书的介绍侧重于基础知识和在 Trace 层面的实践,可以理解为 《Systems Performance: Enterprise and the Cloud》图书的修订版本,重点引入了 BPF 技术的实践。

    全书主题分成四个部分:

    1. 技术

      在第一部分主要涉及的是 BPF 相关的技术和如何使用的总览。

      • BPF 技术介绍
      • 👍 技术背景
      • 性能分析总览
      • BCC 工具介绍
      • BPFTrace 工具介绍

      这个部分的内容介绍,重点在 技术背景 章节,介绍的了 Trace 相关的技术点及实现原理,总结的非常简练和准确,值得多阅读几遍; BCC 和 BPFTrace 工具的介绍更多是从原理和使用层面介绍,详细的知识可以从两者的 github 网址学习到,贵在章节内容总结的有图有条理,可以快速对于整体架构有个快速的认知。

    2. 使用 BPF 工具

      本章节主要是介绍了各种性能分析维度(CPU/Mem/Network/System等)的背景知识、传统工具和BPF 工具使用。

      这个章节可以理解是 《Systems Performance: Enterprise and the Cloud》的缩减(背景知识、传统工具)和BPF 工具的补充,但是也增加了一些多的内容比如安全、容器和虚拟化的内容。

      这部分的内容有方法论、基础知识和使用实践,可以作为日常问题排查的参考工具书。

    3. 附加主题

      作为 BPF 性能工具的补充,还有一些是使用 BPF 各种过程中的小知识、技巧和常见的问题。

    4. 附录

      虽然是作为附录的内容,但是却是我们学习深入技术点的重要参考,主要是 bpftrace 工具的一览表、BCC Tools 开发、使用原生的 C 编写 BPF 和 BPF 指令集等。

      这部分的内容面对的是希望对于 BPF 技术更加深入了解和希望参与到 BCC 工具开发的研发人员。

2.2 BPF 学习样例

如果是 BCC 的样例可以参考 tools 目录下的全部文件; BPFTrace 也可以参考 tools 目录。

内核中的 BPF 样例参见 samples/bpftesting/bpf,这部分的代码都是原生的 C 代码,比较适合对于 BPF 技术原理进一步深入的同学。

如果是一开始学习 BPF,我个人的建议是:

  1. 先大体了解 BPF 技术的发展历史、优点、限制;
  2. 使用 BCC 工具在环境中进行实践,并且初步了解相关工具的的运作机制;
  3. 参考 BCC 样例,用原生的 C 代码进行实践并编写;
  4. 通过 KubeCon 会议或者 BPF Summit 峰会学习当前主要的进展并学习跟进最新的进展;

学习方式也可以参考的大卫李的一篇文章 Linux超能力BPF技术介绍及学习分享,写的内容也比较齐全,可以参考。

3. BPF 资料汇总

如果有好的文章或者思路分析,可以到我的 GitHub Repo 提交 Issue,地址:https://github.com/DavadDi/bpf_study。

3.1 介绍系列

3.2 深入系列

3.3 Linux 资源