为什么你需要BPF性能工具
BPF性能工具可以帮助你改进性能、降低开销、解决软件问题,从而使系统和应用的效益最大化。
它们能比传统性能工具分析得更多,并允许你向生产环境中的系统随意提出问题,并且能够立刻得到答案。
关于本书
- 本书是关于应用在可观测性和性能分析领域的BPF工具的,但是这些工具也有其他用途:软件故障排查、安全分析等。
学习BPF时,最困难的部分不在于写代码:你可以在一天的时间内学会编写接口程序。困难之处在于如何应用:在数以千计的可用事件中,你能够从中得到什么信息?
本书会帮助你回答这些问题,通过给出性能分析的一些必要的背景,然后使用BPF性能工具对许多不同的软硬件目标进行分析,并附上Netlix服务器上的样例输出。 - BPF的可观测性是一种超能力,不过这仅仅是因为BPF扩展了我们对系统和应用的可观测能力,而非重复这种能力。
为了高效地使用BPF,你需要理解什么时候使用传统的性能分析工具,包括iostat(1)和perf(1),什么时候使用BPF工具。
本书也会介绍传统的工具,对于解决某些性能问题它们可能已经够用了,当不能解决时,它们也会提供有用的上下文和线索,指导进一步使用BPF工具。 - 本书中的许多章节包含了学习目标,告知读者哪些是学习要点。
本书中的材料也用在Netlix关于使用BPF分析的内部课程中,有些章节还包含了可选的练习。 - 本书中的许多BPF工具来自BCC和bpftrace的代码仓库,这两个项目是Linux基金会下的10 Visor项目。
它们是开源的,可以自由使用,不仅可以从项目的网站上下载,而且很多Linux发行版中已经包含了它们。
我也为本书新写了一些bpfrace工具,并把它们的源代码一并包含 到本书中。
这些工具并不是为了演示各种BPF功能而随意创建的,创建它们是为了在生产环境
中使用。我使用这些bpfrace工具解决的生产问题超出了当前分析工具集的能力。 - 对于用bpftrace编写的工具,本书已经包含了源代码。如果你希望修改或开发新的bpftrace工具,则可以从第5章中学习bpftrace语言,也可以从本书的许多源代码清单中学习。这些源代码有助于说明每个工具的功能以及它们所检测的事件:就像包含可以运行的伪代码一样。
- BCC和bpfrace前端已经趋于成熟,但是将来的变更可能会导致本书中包含的某些源代码停止工作,并且需要更新。
如果工具来源于BCC或bpfrace,请检查那些存储库中的更新版本。
如果工具来源于本书,请访问本书的网站(本书资料参见链接http://www.broadview.com.cn/39972)。
最重要的不是知晓某个工具有效,而是你了解该工具并让它能够工作。
BPF 跟踪最困难的部分是要知道用它来做什么;甚至损坏的工具也会是有用想法的来源之一。
本书涵盖的既有工具和新工具

关于图形界面(GUI)
一些BCC工具已经成为测量工具GUI的数据来源——BCC工具提供时间序列数据来绘制折线图,BCC工具提供调用栈来绘制火焰图,或者BCC工具提供秒粒度的直方图以绘制热力图等。我预期未来会有更多的人通过GUI使用这些BPF工具,而非直接使用这些工具本身。无论你最终如何使用,它们都可以提供丰富的信息。本书介绍了这些工具提供的指标,如何解读指标,以及你如何自己动手创建新工具。
关于Linux版本
在本书中介绍了许多Linux技术,通常带有内核版本号和出现的年份。有时,我也指明了该技术的开发人员,以便你可以辨识出原始作者撰写的支持材料。
扩展版BPF已被部分地添加到Linux中。第一部分在2014年的Linux 3.18中添加,此后在Linux 4.x和5.x系列中添加了更多内容。
为了具有足够的功能来运行本书中介绍的BPF工具,建议使用Linux 4.9或更高版本。本书中的示例运行在Linux 4.9到5.3内核之上。已经开始将扩展版BPF引入其他内核,并且本书的未来版本可能不仅仅涉及Linux。
本书不包含的内容
BPF的应用范围很广,BPF性能工具的许多用例本书并未涉及,其中包括用于软件定义网络、防火墙、容器安全和设备驱动程序。
本书聚焦于使用bpftrace和BCC工具,以及开发新的bpfrace工具,但不涉及开发新的BCC工具。BCC 源代码通常很长,无法在书中直接包含,但是附录C中提供了一些示例作为可选内容供读者参考。附录D中提供了使用C语言进行编程的示例,附录E中提供了使用BPF指令进行工具开发的示例,对那些希望更深入了解BPF工具的工作原理的人来说,这些示例也可能有用。
本书并不专门针对某种特定语言或应用程序的性能进行分析,因为这方面已经有其他书籍了,它们涵盖了对应语言调试和分析工具的介绍。使用其他工具和BPF工具联合解决问题是很常见的,不同的工具之间可以互补,提供不同的解决问题的线索。本书介绍了来自Linux的基本系统分析工具,因此你可以利用这些工具直接解决一些问题,如果需要进一步分析,再转向使用提供进一步观察能力的BPF工具。
本书简要介绍了每个分析目标的背景和策略。这些主题在我之前出版的那本《性能之巅:洞悉系统、企业与云计算》书中有较详细的解释。
本书的结构
本书分为三个部分。
- 第1部分:第1 ~ 5 章,
介绍了BPF跟踪所需的背景知识,包括性能分析、内核跟踪技术以及两个主要的BPF跟踪前端实现——BCC 和bpfrace. - 第2部分包含第6 ~ 16章,
涵盖BPF可跟踪的目标:CPU、内存、文件系统、磁盘I0、网络、安全、语言、应用程序、内核、容器和虚拟机管理器等。尽管你可以按顺序学习这些章节,但本书设计为支持跳至你感兴趣的章节。
这些章节遵循同样的结构:背景讨论、分析策略的建议以及特定的BPF工具。文中还包含了一些可以帮助读者理顺分析思路的图表。 - 最后一部分,包含第17章和第18章,
涵盖了一些其他主题:其他BPF工具以及提示、技巧和常见问题。
附录提供了bpftrace 单行程序和bpfrace备忘单,介绍了BCC工具的开发,包括通过perf(1) (Linux工具)进行的C BPF工具开发以及BPF指令摘要。本书使用了许多术语和缩写,在需要的地方会对它们进行解释。有关更多信息源,请参见本前言结尾处的“补充材料和参考资料”部分。
目标读者
本书的写作初衷是,希望对各个领域的人都有用。无须任何编码即可使用本书中的BPF工具:你可以将其用作可以运行的预编写工具表。如果确实想编写代码,则本书中包含的所有代码和第5章的内容将帮助你学习快速编写自己的工具。你不必具备性能分析的背景知识,每章会简述必要的背景知识细节。
本书的特定读者包括:
■负责生产系统的系统管理员、站点可靠性工程师、数据库管理员、性能工程师和支持人员可以将本书用作诊断性能问题、了解资源使用情况以及对问题进行故障排除的指南。
■应用程序开发人员可以使用这些工具来分析自己的代码,并检测代码以及系统事件。例如,可以检查触发磁盘I0事件的应用程序代码。这样可以在无法直接查看内核事件的应用程序特定工具之外,提供一个更完整的行为视图。
■安全工程师可以学习如何监控所有的事件以发现可疑行为,并创建正常活动的白名单(请参见第11章)。
■性能监控开发者可以使用本书来获得有关在其产品中添加新的可观测性的想法。
■内核开发人员可以学习如何编写bpfrace单行程序来调试自己的代码。
■学习操作系统和应用程序的学生可以使用BPF工具以新的和自定义的方式分析
正在运行的系统。学生无须学习抽象的内核技术,而是可以对其进行跟踪并实时了解它们的运行方式。为了使本书能够专注于BPF工具的应用,假定你具备较少的关于所涉及主题的知识储备,包括互联网(例如,IPv4 地址是什么)和命令行用法。
补充材料和参考资料
本书中包含的所有工具、勘误和读者反馈都可以从该站点下载。
本书中讨论的许多工具也位于源代码存储库中,在其中对其进行维护和增强。有关这些工具的最新版本,
请参阅以下存储库:
https:///iovisor/bcc https:///iovisor/bpftrace
这些存储库中还包含我创建的BPF社区维护和更新的详细参考指南和教程。
本书的参考资料请访问http://wwwbroadview.com.cn/39972进行下载。
本书中使用的排版约定
本书讨论了不同类型的技术,并且其介绍材料的形式可以提供更多的上下文。
对于工具输出,加粗文本表示已执行的命令,或在某些情况下突出显示感兴趣的内容。井号提示符(#)表示命令或工具已经以root用户(管理员)的身份运行。例如:

美元提示符($)表示以非root用户身份运行命令或工具:

一些提示包括目录名称前缀,用以显示工作目录:

斜体或楷体用于突出显示新术语,有时用于显示占位符文本。
本书中的大多数工具都需要root用户访问权限或同等特权才能运行,如重复使用哈希提示所显示的那样。如果你不是root用户,则以root用户身份执行工具的一种方法是在sudo(8)命令中为它们加上sudo前缀(超级用户可用)。
一些命令用单引号引起来, 以防止不必要的(尽管不太可能) shell扩展。 这是一个好习惯。例如:

Linux命令名称或系统调用后面会跟着括号:
括号中的数字表明其属于man帮助文档的第几部分——例如, Is(1) 命令、read(2) 系统调用和funccount(8) 系统管理命令。空括号表示其来自编程语言的函数调用——例如, vfs_ read() 内核函数。当带有参数的命令被包含在段落中时,它们将使用等宽字体。
被截断的命令输出在方括号([…]) 中包括省略号。包含^C的单行程序表示需按Ctrl+C组合键来终止程序。
















