作者简介:狄卫华,趣头条资深架构师,主要关注云原生相关领域,目前聚焦在 BPF 技术及实践.
1. 为什么要学习 BPF
可以先从 ebpf.io[1] 网站获取一个简单的了解,首页内容翻译如下。
Linux 内核一直是实现监控/可观察性、网络和安全性的理想场所。不幸的是,这往往是不切实际的,因为它需要改变内核源代码或加载内核模块,并导致层层抽象叠加。eBPF 是一项革命性的技术,它可以在 Linux 内核中运行沙盒程序,而无需改变内核源代码或加载内核模块。
通过使Linux内核可编程,基础架构软件可以利用现有的层,使其更加智能,功能更加丰富,而不会继续给系统增加额外的复杂度,也不会影响执行效率和安全性。
eBPF 开发了全新一代的软件,能够对 Linux 内核的行为进行重新编程,甚至在传统上完全独立的多个子系统中应用逻辑。

BPF 技术目前主要用于以下场景:
追踪和性能分析(Tracing & Profiling)
将 eBPF 程序附加到跟踪点以及内核和用户应用探针点的能力,使得应用程序和系统本身的运行时行为具有前所未有的可见性。通过赋予应用程序和系统两方面的检测能力,可以将两种视图结合起来,从而获得强大而独特的洞察力来排除系统性能问题。先进的统计数据结构允许以高效的方式提取有意义的可见性数据,而不需要像类似系统那样,通常需要导出大量的采样数据。
观测和监控(Obervability & Monitoring)
eBPF 不依赖于操作系统暴露的静态计数器和测量,而是实现了自定义指标的收集和内核内聚合,并基于广泛的可能来源生成可见性事件。这扩展了实现的可见性深度,并通过只收集所需的可见性数据,以及在事件源处生成直方图和类似的数据结构,而不是依赖样本的导出,大大降低了整体系统的开销。
网络(Network)
可编程性和效率的结合使得 eBPF 自然而然地满足了网络解决方案的所有数据包处理要求。eBPF 的可编程性使其能够在不离开 Linux内核的包处理上下文的情况下,添加额外的协议解析器,并轻松编程任何转发逻辑以满足不断变化的需求。JIT 编译器提供的效率使其执行性能接近于本地编译的内核代码。
安全(Security)
在看到和理解所有系统调用的基础上,将其与所有网络操作的数据包和套接字级视图相结合,可以采用革命性的新方法来确保系统的安全。虽然系统调用过滤、网络级过滤和进程上下文跟踪等方面通常由完全独立的系统处理,但 eBPF 允许将所有方面的可视性和控制结合起来,以创建在更多上下文上运行的、具有更好控制水平的安全系统。
在追踪方面细分为了两类:
追踪和性能分析 观测和监控 这两者的区别主要在于数据的搜集和聚合是否在内测层面进行的,观测和监控主要是侧重于在内核导出指标、直方图或相关事件。
![]() | ![]() |
|---|---|
![]() | ![]() |
BPF 技术的整体介绍请参见 eBPF 技术简介[2]。
2. BPF 应该怎么学习
2.1 BPF 书籍
2.1.1 书籍介绍
如果是想系统学习 BPF 技术,我的建议是先阅读相关的书籍,得到一个整体的认识,然后分方向单独深入。
目前 BPF 的书籍主要有以下两本:
《Linux Observability with BPF》[3]
图书全名为:《Linux Observability with BPF: Advanced Programming for Performance Analysis and Networking》。
早期该书的电子版可以在 sysdig 官网下载,国内可以在此处下载[4]:链接: 提取码: bebt。
本书两位作者合著:
当前图书已经翻译成中文,京东地址:《Linux内核观测技术BPF》[5]。
[美] 大卫·卡拉维拉(David Calavera)Netlify 的 CTO,曾是 Docker 的维护者以及 Runc、Go 和 BCC 工具及其他开源项目的贡献者 [意] 洛伦佐·丰塔纳(Lorenzo Fontana)Sysdig 开源团队的成员,主要负责CNCF的 Falco 项目,该项目通过内核模块和 eBPF 实现了容器运行时安全和异常检测功能。 《BPF Performance Tools》 [6]
图书全名为:《BPF Performance Tools: Linux System and Application Observability[7]》
作者为大名鼎鼎的性能大师 Brendan Gregg[8],该书目前还没有中文版,如果购买英文版,可以从外文书店[9]代购,2-3 周可以收到。
他还写过一本性能优化的畅销书 《Systems Performance: Enterprise and the Cloud》,中文翻译版本为 《性能之巅:洞悉系统、企业与云计算》[10]。该书的第二版作者还在修订中,可参见:《Systems Performance: Enterprise and the Cloud, Second Edition (2020)[11]》。
Brendan Gregg 的博客地址为:http://www.brendangregg.com/,里面有关于性能优化的诸多宝藏,值得仔细学习和研究。
2.1.2 图书心得
《Linux Observability with BPF》[12]
中文和英文版都在 180 页左右,整体的思路清晰,相关的技术面面俱到,如果定位是整体理解(而不是实践练习),整本书阅读一天内可以完成,能够实现快速对于 BPF 技术的整体了解,但是本书对于涉及的内容介绍基本上还是停留在基础知识介绍,基本上无深入知识介绍,作为入门级别的书籍再合适不过。主要内容包括以下方面:
国外几大公司 Sysdig 、Floowmill 等在 BPF 的技术实践。 主要是 Seccomp(基于传统的 cBPF)和 LSM 钩子两个方面的内容,主要是简单的介绍,内容不多; Linux 网络和 BPF:涵盖数据包过滤和 cls_bpf 相关内容; XDP:由于 XDP 在网络数据处理的特殊地位,单独成章,对于 XDP 进行了简单介绍和一个简单的原理实现,以及如何使用 BCC 进行 XDP 相关的验证; BPF Trace:Trace 的基础知识(kprobe、tracepoint、usdt等)和几个 BCC 使用的样例; BPF 相关工具(BPFTool & BPFTrace & kubectl-trace & eBPF Exportor); BPF 的历史及架构; BPF 的程序类型和验证器:按照重要性依次介绍了各种程序类型; BPF Map:BPF Map 类型,常见操作和以及 Map 相关虚拟系统; BPF 基础知识
BPF Trace
BPF Network
安全
真实的用户案例
《BPF Performance Tools》 [13]
本书英文版 839 页,主要涉及的 BPF 技术的基础、BPF Trace 基础基础知识、BPF 技术 Trace 方面的各种实践,本书无 BPF 在网络、安全上的详细介绍。本书的介绍侧重于基础知识和在 Trace 层面的实践,可以理解为 《Systems Performance: Enterprise and the Cloud》图书的修订版本,重点引入了 BPF 技术的实践。
全书主题分成四个部分:
BPF 技术介绍 👍 技术背景 性能分析总览 BCC 工具介绍 BPFTrace 工具介绍 技术
在第一部分主要涉及的是 BPF 相关的技术和如何使用的总览。
这个部分的内容介绍,重点在
技术背景
章节,介绍的了 Trace 相关的技术点及实现原理,总结的非常简练和准确,值得多阅读几遍;BCC 和 BPFTrace 工具的介绍更多是从原理和使用层面介绍,详细的知识可以从两者的 github 网址学习到,贵在章节内容总结的有图有条理,可以快速对于整体架构有个快速的认知。使用 BPF 工具
本章节主要是介绍了各种性能分析维度(CPU/Mem/Network/System等)的背景知识、传统工具和BPF 工具使用。
这个章节可以理解是 《Systems Performance: Enterprise and the Cloud》的缩减(背景知识、传统工具)和BPF 工具的补充,但是也增加了一些多的内容比如安全、容器和虚拟化的内容。
这部分的内容有方法论、基础知识和使用实践,可以作为日常问题排查的参考工具书。
附加主题
作为 BPF 性能工具的补充,还有一些是使用 BPF 各种过程中的小知识、技巧和常见的问题。
附录
虽然是作为附录的内容,但是却是我们学习深入技术点的重要参考,主要是 bpftrace 工具的一览表、BCC Tools 开发、使用原生的 C 编写 BPF 和 BPF 指令集等。
这部分的内容面对的是希望对于 BPF 技术更加深入了解和希望参与到 BCC 工具开发的研发人员。
2.2 BPF 学习样例
如果是 BCC 的样例可以参考 tools[14] 目录下的全部文件;BPFTrace 也可以参考 tools[15] 目录。
内核中的 BPF 样例参见 samples/bpf[16] 和 testing/bpf[17],这部分的代码都是原生的 C 代码,比较适合对于 BPF 技术原理进一步深入的同学。
如果是一开始学习 BPF,我个人的建议是:
先大体了解 BPF 技术的发展历史、优点、限制; 使用 BCC 工具在环境中进行实践,并且初步了解相关工具的的运作机制; 参考 BCC 样例,用原生的 C 代码进行实践并编写; 通过 KubeCon 会议或者 BPF Summit[18] 峰会学习当前主要的进展并学习跟进最新的进展;
学习方式也可以参考的大卫李的一篇文章 Linux超能力BPF技术介绍及学习分享[19],写的内容也比较齐全,可以参考。
3. BPF 资料汇总
如果有好的文章或者思路分析,可以到我的 GitHub Repo[20] 提交 Issue,地址:https://github.com/DavadDi/bpf_study。
3.1 介绍系列
👍 https://ebpf.io[21] 官方维护的站点,上面的资料还是比较完整和权威的
👍👍 [译] 大规模微服务利器:eBPF + Kubernetes(KubeCon, 2020)[22] BPF Maintainer Daniel 的大作,非常详细,本文内容的时间跨度有 8 年,覆盖了 eBPF 发展的整个历史,非常值得一读。pdf[23]
👍 [译] 如何基于 Cilium 和 eBPF 打造可感知微服务的 Linux(2019)[24] pdf[25]
An eBPF overview 系列
part 1: Introduction[26] part 2: Machine & bytecode[27] part 3: Walking up the software stack[28] part 4: Working with embedded systems[29] part 5: Tracing user processes[30] The art of writing eBPF programs: a primer[31]
A Deep Dive into eBPF: The Technology that Powers Tracee[32]
Linux Extended BPF (eBPF) Tracing Tools[33] Brendan Gregg
A thorough introduction to eBPF[34]
iovisor[35]/bpf-docs[36]
3.2 深入系列
Linux 内核 BPF 文档[37]
bpf 归档的邮件列表 https://lore.kernel.org/bpf/, 完整列表 http://vger.kernel.org/vger-lists.html
👍 Dive into BPF: a list of reading material[38],中文参见这里[39], 基于这个文档有作者整理了一个更加清晰的分类 zoidbergwill/awesome-ebpf[40] 和 \**awesome-ebpf **[41]- 中文
👍👍 Cillum BPF and XDP Reference Guide[42] [译] Cilium:BPF 和 XDP 参考指南(2019) [43]
lwn.net#Berkeley_Packet_Filter[44] lwn.net 网站中与 BPF 相关的主题文章,对于了解 BPF 的历史非常有帮助
👍👍 Oracle Blog 系列教程,深入浅出,是深入学习的必学教程
BPF program types[45],配合 eBPF features by Linux version[46] 效果更好 BPF helper functions for those programs[47] BPF userspace communication[48] BPF program build environment[49] BPF bytecodes and verifier[50] BPF Packet Transformation[51] The Power of XDP[52] Notes on BPF (7) - BPF, tc and Generic Segmentation Offload[53] Taming Tracepoints in the Linux Kernel[54] 👍 xdp-tutorial[55] 里面有详细的 xdp 的源码,是学习 xdp 的好地方
👍 [译] 深入理解 Cilium 的 eBPF 收发包路径(datapath)(KubeCon, 2019)[56] pdf[57]
3.3 Linux 资源
在线内核源码 https://elixir.bootlin.com/
本文首发于深入浅出 eBPF 技术博客 https://www.ebpf.top/post/ebpf_learn_path/。
参考资料
ebpf.io: https://ebpf.io/
[2]eBPF 技术简介: https://www.ebpf.top/post/bpf_intro_blog/
[3]《Linux Observability with BPF》: https://www.amazon.com/Linux-Observability-BPF-Programming-Performance/dp/1492050202
[4]此处下载: https://pan.baidu.com/s/10gYYVXOdTX4HQ-_dQfWfOQ
[5]《Linux内核观测技术BPF》: https://item.jd.com/72110825905.html
[6]《BPF Performance Tools》 : http://www.brendangregg.com/bpf-performance-tools-book.html
[7]BPF Performance Tools: Linux System and Application Observability: http://www.brendangregg.com/bpf-performance-tools-book.html
[8]Brendan Gregg: http://www.brendangregg.com/
[9]外文书店: https://item.jd.com/64536164411.html
[10]《性能之巅:洞悉系统、企业与云计算》: https://item.jd.com/11755695.html
[11]Systems Performance: Enterprise and the Cloud, Second Edition (2020): http://www.brendangregg.com/systems-performance-2nd-edition-book.html
[12]《Linux Observability with BPF》: https://www.amazon.com/Linux-Observability-BPF-Programming-Performance/dp/1492050202
[13]《BPF Performance Tools》 : http://www.brendangregg.com/bpf-performance-tools-book.html
[14]tools: https://github.com/iovisor/bcc/tree/master/tools
[15]tools: https://github.com/iovisor/bpftrace/tree/master/tools
[16]samples/bpf: https://elixir.bootlin.com/linux/v5.8/source/samples/bpf
[17]testing/bpf: https://elixir.bootlin.com/linux/v5.8/source/tools/testing/selftests/bpf
[18]BPF Summit: https://ebpf.io/summit-2020
[19]Linux超能力BPF技术介绍及学习分享: https://cloud.tencent.com/developer/article/1698426
[20]GitHub Repo: https://github.com/DavadDi/bpf_study
[21]https://ebpf.io: https://ebpf.io/
[22][译] 大规模微服务利器:eBPF + Kubernetes(KubeCon, 2020): http://arthurchiao.art/blog/ebpf-and-k8s-zh/
[23]pdf: https://github.com/DavadDi/bpf_study/blob/master/BPF-and-Kubernetes-Little-Helper-Minions-for-Scaling-Microservices/Aug19_eBPF_and_Kubernetes_Little_Helper_Minions_for_Scaling_Microservices_Daniel_Borkmann.pdf
[24][译] 如何基于 Cilium 和 eBPF 打造可感知微服务的 Linux(2019): https://github.com/DavadDi/bpf_study/blob/master/how-to-make-linux-microservice-aware-with-cilium-ebpf/index.md
[25]pdf: https://github.com/DavadDi/bpf_study/blob/master/how-to-make-linux-microservice-aware-with-cilium-ebpf/bpf_-_turning_linux_into_a_microservices-aware_operating_system.pdf
[26]part 1: Introduction: https://www.collabora.com/news-and-blog/blog/2019/04/05/an-ebpf-overview-part-1-introduction/
[27]part 2: Machine & bytecode: https://www.collabora.com/news-and-blog/blog/2019/04/15/an-ebpf-overview-part-2-machine-and-bytecode/
[28]part 3: Walking up the software stack: https://www.collabora.com/news-and-blog/blog/2019/04/26/an-ebpf-overview-part-3-walking-up-the-software-stack/
[29]part 4: Working with embedded systems: https://www.collabora.com/news-and-blog/blog/2019/05/06/an-ebpf-overview-part-4-working-with-embedded-systems/
[30]part 5: Tracing user processes: https://www.collabora.com/news-and-blog/blog/2019/05/14/an-ebpf-overview-part-5-tracing-user-processes/
[31]The art of writing eBPF programs: a primer: https://github.com/DavadDi/bpf_study/blob/master/the-art-of-writing-ebpf-programs-a-primer/index.md
[32]A Deep Dive into eBPF: The Technology that Powers Tracee: https://blog.aquasec.com/intro-ebpf-tracing-containers
[33]Linux Extended BPF (eBPF) Tracing Tools: http://www.brendangregg.com/ebpf.html
[34]A thorough introduction to eBPF: https://lwn.net/Articles/740157/
[35]iovisor: https://github.com/iovisor
[36]bpf-docs: https://github.com/iovisor/bpf-docs
[37]Linux 内核 BPF 文档: https://www.infradead.org/~mchehab/kernel_docs/bpf/index.html
[38]Dive into BPF: a list of reading material: https://qmonnet.github.io/whirl-offload/2016/09/01/dive-into-bpf/
[39]这里: https://www.zcfy.cc/article/dive-into-bpf-a-list-of-reading-material
[40]zoidbergwill/awesome-ebpf: https://github.com/zoidbergwill/awesome-ebpf
[41]**awesome-ebpf **: https://github.com/icopy-site/awesome-cn/blob/master/docs/awesome/awesome-ebpf.md
[42]Cillum BPF and XDP Reference Guide: https://docs.cilium.io/en/v1.8/bpf/
[43][译] Cilium:BPF 和 XDP 参考指南(2019) : http://arthurchiao.art/blog/cilium-bpf-xdp-reference-guide-zh/
[44]lwn.net#Berkeley_Packet_Filter: https://lwn.net/Kernel/Index/#Berkeley_Packet_Filter
[45]BPF program types: http://blogs.oracle.com/linux/notes-on-bpf-1
[46]eBPF features by Linux version: https://github.com/iovisor/bcc/blob/master/docs/kernel-versions.md
[47]BPF helper functions for those programs: http://blogs.oracle.com/linux/notes-on-bpf-2
[48]BPF userspace communication: http://blogs.oracle.com/linux/notes-on-bpf-3
[49]BPF program build environment: http://blogs.oracle.com/linux/notes-on-bpf-4
[50]BPF bytecodes and verifier: http://blogs.oracle.com/linux/notes-on-bpf-5
[51]BPF Packet Transformation: http://blogs.oracle.com/linux/notes-on-bpf-6
[52]The Power of XDP: https://blogs.oracle.com/linux/the-power-of-xdp
[53]Notes on BPF (7) - BPF, tc and Generic Segmentation Offload: https://blogs.oracle.com/linux/notes-on-bpf-7
[54]Taming Tracepoints in the Linux Kernel: https://blogs.oracle.com/linux/taming-tracepoints-in-the-linux-kernel
[55]xdp-tutorial: https://github.com/xdp-project/xdp-tutorial
[56][译] 深入理解 Cilium 的 eBPF 收发包路径(datapath)(KubeCon, 2019): http://arthurchiao.art/blog/understanding-ebpf-datapath-in-cilium-zh/
[57]pdf: https://github.com/DavadDi/bpf_study/blob/master/Understanding-the-eBPF-Datapath-in-Cilium/eBPF-and-the-Cilium-Datapath.pdf
欢迎长按识别下图中的二维码订阅“漫谈云原生”公众号,回复任意关键字查询更多云原生资料。









