购买
下载掌阅APP,畅读海量书库
立即打开
畅读海量书库
扫码下载掌阅APP

序言

作为一名程序员,我喜欢紧跟内核和计算研究方面的各种最新技术。当第一次接触到BPF和XDP(eXpress Data Path)技术时,我就被深深地吸引了。我非常高兴本书聚焦于BPF和XDP技术,让更多的人在项目中使用如此优秀的技术。

首先聊聊我的背景以及我为什么如此喜欢研究内核。我曾与David一起担任Docker核心维护人员,主要负责使用iptables为容器提供过滤和路由逻辑。我提交的第一个PR就是修复CentOS上不同版本iptables命令行参数不兼容而执行失败的问题。如果你和我一样,经常开发和使用命令行工具,那么你也一定会遇到过很多诸如此类的问题。除此之外,在主机上构建成千上万的规则也会让iptables不堪重负,我需要解决由此导致的系统性能问题。

当我接触BPF和XDP工具后,简直如获珍宝。我不再苦恼于使用iptables遇到的类似问题。另外,我非常高兴地获悉内核社区甚至计划使用BPF( https://oreil.ly/cuqTy )替代iptables,同时,容器网络工具Cilium( https://cilium.io )也正在采用BPF和XDP进行构建。

除了可以实现更加优秀的iptables的功能外,BPF还可以实现更多的功能,比如,帮助我们跟踪系统调用、内核函数和用户态的程序。Linux系统上的bpftrace( https://github.com/iovisor/bpftrace )命令行工具实现了类似于DTrace的强大的功能。bpftrace可以跟踪所有正在打开的文件句柄、打开文件的进程,统计程序的系统调用,跟踪OOM killer,等等,一切尽在掌握之中。BPF和XDP也被用在Cloudflare( https://oreil.ly/OZdmj )和Facebook的负载均衡器( https://oreil.ly/wrM5- )上,用于防御DDoS攻击。XDP在网络过滤数据包方面表现得相当出色,在本书的XDP和网络部分可以了解到更多的信息。

我有幸在Kubernetes社区认识了Lorenzo,他开发的kubectl-trace( https://oreil.ly/Ot7kq )工具可以让用户在Kubernetes集群上轻松地运行定制化的跟踪程序。

就个人而言,我也非常喜欢使用BPF编写定制化的跟踪器,向同事证明他们编写的软件需要进行性能优化,或要求他们减少昂贵的系统调用次数以提升程序性能。不要低估通过数据协助别人进行系统调优的威力。不要担心,本书将会指导你编写第一个跟踪程序,并帮助你进行系统性能优化。BPF之前的工具都是通过使用有损队列,将样本集发送到用户空间进行聚合,而BPF则可以在内核空间直接基于事件源构建直方图和过滤,这种机制非常适用于生产环境。

我职业生涯的一半时间都在从事工具开发。最好的工具是提供自治,开发者可以使用工具提供的接口进行自治,工具的使用场景甚至可能超出工具开发者的设计想法。引用Richard Feynman的话:“我很早就意识到知道事情名字和知道事情本身的区别。”到现在为止,我们应该已经知道了BPF的名字,并了解了BPF能给我们带来帮助。

我喜欢这本书是因为它介绍了使用BPF创建新工具所需掌握的知识。阅读本书并完成练习后,你将拥有使用BPF的超级能力。你可以将BPF放置在工具箱中,在最需要时让其发挥作用。通过本书,你不仅能了解到BPF技术,而且也能学习到BPF的工作原理。本书可以帮你打开思路来探索使用BPF进行各种实践的途径。

这个欣欣向荣的生态系统非常令人兴奋!我希望越来越多的人开始使用BPF,并将BPF的力量变得更加强大。我很乐意了解本书的读者最终会采用BPF构建什么,无论是用来跟踪软件错误、自定义防火墙还是编写红外解码( https://lwn.net/Articles/759188 )的脚本。请让我们知道你如何使用BPF进行构建!

——Jessie Frazelle QAH32P728JgZtDTfL53X7j29yTM+JoBqvaRGXaYyxPbzrlydGk0dhbOwPOARBurX



前言

2015年,David是Docker公司(一家让容器技术变得流行的公司)的一名核心开发工程师。他的日常工作包括两部分:维护Docker社区和促进Docker项目发展。他既需要审查贡献者提交的PR,也需要确保Docker可以在各种场景下稳定高效地工作,特别是在成千上万容器运行的高负载场景下。

当时,我们采用火焰图来分析Docker相关的性能问题。火焰图提供的高级可视化功能,可以让我们非常方便地浏览分析的数据。Go语言通过内嵌的HTTP服务可以非常容易地提取到应用的性能数据,并能够基于性能数据产生数据图表。David曾写过一篇文章,讲述Go语言的性能分析器,并描述如何基于数据生成火焰图。但是,使用Go语言性能分析器来收集Docker的性能数据也存在着一些问题,因为性能分析器的功能默认是关闭的。所以,如果要开启性能调试,我们必须要重启Docker服务,这可能导致失去运行时的性能数据,迫使我们花费时间等待问题再次重现。David的文章中提到了重启Docker是诊断Docker性能问题的必要步骤。但是,最好的方式应该是不重启服务就能达到分析性能问题的目的。这驱使David开始研究收集和分析程序性能指标的各种技术,不久他就发现了BPF。

与此同时,与David相距甚远的Lorenzo,也在寻求一种更好地研究Linux内核内部机制的方式,他发现学习BPF可以更容易地了解更多的内核子系统。几年后,他已经在InfluxData的工作中应用了BPF技术,以更快地在InfluxCloud中提取数据。如今Lorenzo不仅活跃于BPF社区,他还就职于Sysdig公司,从事Falco项目中IOVisor工具的开发——IOVisor使用BPF来保证容器和Linux系统的运行时安全。

在过去的几年时间内,我们已经尝试在更多的场景中使用BPF,包括收集Kubernetes集群数据、管理网络流量策略。通过阅读BPF领导者Brendan Gregg、Alexei Starovoitov,以及Clilium和Facebook公司的诸多技术博客,我们学习了BPF技术的底层原理。他们的博客和文章给予了我们极大的帮助,同时也是本书诸多引用的来源。

每次学习BPF技术时,我们都需要翻阅博客文章、手册以及Internet上的各种资料。本书的目的就是将分散在各处的知识汇总在一起,以便于BPF爱好者能更好地学习这一神奇技术。

本书分为9章演示如何使用BPF完成相关任务。你可以单独阅读一些章节作为参考指南,但是如果你是BPF的新手,我们建议你按顺序阅读。这样你可以了解BPF的核心概念,并逐步了解BPF在未来可能发挥的作用。

无论你是可观测性和性能分析方面的专家,还是正尝试开始研究新技术来解决生产系统问题的新手,我们都希望你能从本书中受益。

本书排版约定

下面是本书中使用的排版约定:

斜体(Italic)

表示新术语、URL、Email、文件名及文件扩展名。

等宽字体(Constant Width)

表示程序片段,以及正文中出现的变量、函数名、数据库、数据类型、环境变量、语句和关键字等。

等宽粗体(Constant width bold)

表示命令或其他由用户直接输入的文本。

等宽斜体(Constant Width Italic)

表示应当被用户提供的值或上下文决定的值所替换的文本。

这个图标表示提示或建议。

这个图标表示一般说明。

这个图标表示警告或注意。

示例代码

可以从 https://oreil.ly/lbpf-repo 下载补充材料(示例代码、练习等)。

这里的代码是为了帮助你更好地理解本书的内容。通常,可以在程序或文档中使用本书中的代码,而不需要联系O’Reilly获得许可,除非需要大段地复制代码。例如,使用本书中所提供的几个代码片段来编写一个程序不需要得到我们的许可,但销售或发布O’Reilly的配套CD-ROM则需要O’Reilly出版社的许可。引用本书的示例代码来回答一个问题也不需要许可,将本书中的示例代码的很大一部分放到自己的产品文档中则需要获得许可。

非常欢迎读者使用本书中的代码,希望(但不强制)注明出处。注明出处的形式包含书名、作者、出版社和ISBN,例如:

Linux Observability with BPF,作者David Calavera和Lorenzo Fontana,由O’Reilly出版,书号为978-1-492-05020-9

如果读者觉得对示例代码的使用超出了上面所给出的许可范围,欢迎通过permission@oreilly.com联系我们。

O’Reilly在线学习平台(O’Reilly Online Learning)

近40年来,O’Reilly Media致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。

我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly和200多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问 http://oreilly.com

如何联系我们

对于本书,如果有任何意见或疑问,请按照以下地址联系本书出版商。

美国:

O’Reilly Media,Inc.

1005 Gravenstein Highway North

Sebastopol,CA 95472

中国:

北京市西城区西直门南大街2号成铭大厦C座807室(100035)

奥莱利技术咨询(北京)有限公司

要询问技术问题或对本书提出建议,请发送电子邮件至bookquestions@oreilly.com。

本书配套网站 https://oreil.ly/linux-bpf 上列出了勘误表、示例以及其他信息。

关于书籍、课程、会议和新闻的更多信息,请访问我们的网站 http://www.oreilly.com

我们在Facebook上的地址: http://facebook.com/oreilly

我们在Twitter上的地址: http://twitter.com/oreillymedia

我们在YouTube上的地址: http://www.youtube.com/oreillymedia

致谢

写这本书比我们想象的要难,但这本书可能是我们一生中做得最有益的事情之一。我们为此付出了夜以继日的努力。感谢我们的合作伙伴、家人、朋友的帮助。感谢Lorenzo的女朋友Debora Pace,还有他的儿子Riccardo,感谢他们在我们漫长的写作过程中的耐心等待。同时感谢Lorenzo的朋友Leonardo Di Donato提出的建议,特别是关于XDP和测试部分的意见。

感谢David的妻子Robin Means为我们校对部分章节的初稿。感谢她对本书开始章节的审阅,以及多年以来对David写作的帮助。

同时,感谢那些对eBPF和BPF做出贡献的人们。感谢David Miller和Alexei Starovoitov持续改进Linux内核和BPF。感谢Brendan Gregg的分享、热情及在BPF工具上的贡献。感谢IOVisor项目组的同事,感谢他们的共识、电子邮件和在bpftrace、gobpf、kubectl-trace、BCC方面所做的贡献。感谢Jessie Frazelle为我们撰写序言,并激励着我们和成千上万的开发者。感谢Jérôme Petazzoni出色的技术审校,他提出的问题让我们对本书中许多章节和代码样例提供的方法重新进行了思考。

感谢所有成千上万的Linux内核贡献者,特别是在BPF邮件列表中活跃的人,感谢他们提供的问题和答案、补丁和他们的主动性。最后,我要感谢参与这本书出版的所有人,包括我们的编辑John Devins和Melissa Potter,还有所有幕后(包括封面制作、审阅到出版)的工作人员,他们是我们见过的最专业的人。 WjQJWq0/ALAkoCSJkJS6qtsAgYH7KZBitXxb99jRgYMXO9o2++ZefffRNYeBVR/4

点击中间区域
呼出菜单
上一章
目录
下一章
×