描述
开 本: 16开纸 张: 胶版纸包 装: 平装-胶订是否套装: 否国际标准书号ISBN: 9787121399725
作为BPF技术的开拓者和专家,Brendan Gregg在本书中不仅展示了超过150个可以立即使用的分析工具和调试工具,对这些工具的应用场景进行了分析,还提供了开发自定义工具的分步指南。在本书中,读者可学习到如何分析CPU、内存、存储设备、文件系统、网络、编程语言、应用程序、容器、虚拟机管理器、安全及内核。Gregg带领读者由浅入深地了解从基础工具到进阶工具的使用,帮助读者收集更有用、更深入的技术信息,可以用来优化几乎任何类型的Linux系统和应用程序。
◎学习必备的跟踪知识,以及两个核心BPF前端:BCC和bpftrace。
◎掌握超过150个强大的BPF工具的使用方法,其中包括几十个专为本书开发的工具,全部可以下载使用。
◎掌握有效的分析策略、分析技巧,以及提高分析效率的小窍门。
◎掌握各种编程语言的分析技巧,包括编译型、JIT编译型、解释型语言,如C、Java、bash shell等。
◎学习如何生成各种新的性能指标、调用栈信息,以及自定义延迟直方图。
◎学习如何使用传统工具配合BPF分析来快速简单地实现目标。
◎探索基于BPF构建的高级工具:实现远程监控的PCP和Grafana组合、eBPF导出器,以及跟踪Kubernetes的kubectl—trace。
基于BPF的性能优化工具提供了前所未有的系统级和应用程序级的观察能力,使用这些工具可以优化性能、调试代码、增强安全性、降低成本。本书是使用这些观察工具的全面指南。本书作为全面介绍 BPF 技术的图书,从 BPF 技术的起源到未来发展方向都有涵盖,不仅全面介绍了 BPF 的编程模型,还完整介绍了两个主要的 BPF 前端编程框架 — BCC 和 bpftrace,更给出了一系列实现范例,全面展示了 BPF技术的实际能力和未来发展前景,以及使用BPF工具优化性能、修复问题、探索线上系统的内部情况。
本书的另一个关注方向是 Linux 系统性能和应用程序性能的调优。本书全面介绍了系统性能调优的策略、工具与实践案例,不仅介绍了对应的 BPF 工具,还着重介绍了这些工具如何与 Linux 传统性能工具进行互补,这样读者可以有选择地进行使用。
本书介绍的工具小巧精致,且包含了简单易读的源代码,这就是 BPF 技术的魅力所在 :安全、高效、快捷的系统扩展力。未来 BPF 技术在 Linux 中的应用场景会越来越多,越来越重要。希望本书能在大家学习这项技术并关注它的发展时提供一定的便利。本书是系统管理员、应用程序开发者、运维人员,以及其他IT从业者在企业内部或云上使用各种Linux发行版时都可参考的资料。
第1章 引 言1
1.1 BPF和eBPF是什么 1
1.2 跟踪、嗅探、采样、剖析和可观测性分别是什么 2
1.3 BCC、bpftrace和IO Visor 3
1.4 初识BCC:快速上手 4
1.5 BPF跟踪的能见度 7
1.6 动态插桩:kprobes和uprobes 8
1.7 静态插桩:tracepoint和USDT 9
1.8 初识bpftrace:跟踪open() 10
1.9 再回到BCC:跟踪open() 13
1.10 小结 15
第2章 技术背景16
2.1 图释BPF 16
2.2 BPF 17
2.3 扩展版BPF 18
2.4 调用栈回溯 41
2.5 火焰图 44
2.6 事件源 48
2.7 kprobes 49
2.8 uprobes 53
2.9 跟踪点 57
2.10 USDT 62
2.11 动态USDT 66
2.12 性能监控计数器 68
2.13 perf_events 69
2.14 小结 70
第3章 性能分析71
3.1 概览 71
3.2 性能分析方法论 73
3.3 Linux 60秒分析 77
3.4 BCC工具检查清单 84
3.5 小结 90
第4章 BCC91
4.1 BCC的组件 92
4.2 BCC的特性 92
4.3 安装BCC 94
4.4 BCC的工具 96
4.5 funccount 100
4.6 stackcount 105
4.7 trace 110
4.8 argdist 117
4.9 工具文档 121
4.10 开发BCC工具 126
4.11 BCC的内部实现 127
4.12 BCC的调试 128
4.13 小结 136
第5章 bpftrace137
5.1 bpftrace的组件 138
5.2 bpftrace的特性 139
5.3 bpftrace的安装 141
5.4 bpftrace工具 143
5.5 bpftrace单行程序 145
5.6 bpftrace的文档 146
5.7 bpftrace编程 146
5.8 bpftrace的帮助信息 155
5.9 bpftrace的探针类型 157
5.10 bpftrace的控制流 163
5.11 bpftrace的运算符 164
5.12 bpftrace的变量 165
5.13 bpftrace的函数 170
5.14 bpftrace映射表的操作函数 177
5.15 bpftrace的下一步工作 183
5.16 bpftrace的内部运作 185
5.17 bpftrace的调试 186
5.18 小结 190
第6章 CPU.191
6.1 背景知识 192
6.2 传统工具 197
6.3 BPF工具 210
6.4 BPF单行程序 251
6.5 可选练习 253
6.6 小结 254
第7章 内存.255
7.1 背景知识 256
7.2 传统工具 263
7.3 BPF工具 269
7.4 BPF单行程序 288
7.5 可选练习 289
7.6 小结 290
第8章 文件系统291
8.1 背景知识 292
8.2 传统工具 296
8.3 BPF工具 302
8.4 BPF单行程序 353
8.5 可选练习 359
8.6 小结 360
第9章 磁盘I/O361
9.1 背景知识 362
9.2 传统工具 367
9.3 BPF工具 372
9.4 BPF单行程序 406
9.5 可选练习 409
9.6 小结 410
第10章 网络411
10.1 背景知识 412
10.2 传统工具 422
10.3 BPF工具 433
10.4 BPF单行程序 507
10.5 可选练习 513
10.6 小结 515
第11章 安全516
11.1 背景知识 516
11.2 BPF工具 523
11.3 BPF单行程序 542
11.4 小结 544
第12章 编程语言.545
12.1 背景知识 545
12.2 C 551
12.3 Java 560
12.4 bash shell 601
12.5 其他语言 614
12.6 小结 619
第13章 应用程序.620
13.1 背景知识 621
13.2 BPF工具 625
13.3 BPF单行程序 662
13.4 BPF单行程序示范 664
13.5 小结 664
第14章 内核665
14.1 背景知识 666
14.2 分析策略 669
14.3 传统工具 670
14.4 BPF工具 675
14.5 BPF单行程序 697
14.6 BPF单行程序示范 699
14.7 挑战 700
14.8 小结 700
第15章 容器701
15.1 背景知识 701
15.1.1 BPF 的分析能力 703
15.1.2 挑战 703
15.1.3 分析策略 706
15.2 传统工具 706
15.2.1 从主机上分析 706
15.2.2 在容器内分析 707
15.2.3 systemd-cgtop 707
15.2.4 kubectl top 708
15.2.5 docker stats 708
15.2.6 /sys/fs/cgroups 709
15.2.7 perf 709
15.3 BPF工具 710
15.4 BPF单行程序 717
15.5 可选练习 717
15.6 小结 718
第16章 虚拟机管理器719
16.1 背景知识 719
16.2 传统工具 722
16.3 访客系统的BPF工具 723
16.4 宿主机BPF工具 732
16.5 小结 737
第17章 其他BPF性能工具738
17.1 Vector和Performance Co-Pilot(PCP) 738
17.2 Grafana和Performance Co-Pilot 747
17.3 Cloudflare eBPF Prometheus Exporter(配合Grafana) 750
17.4 kubectl-trace 752
17.5 其他工具 755
17.6 小结 755
第18章 建议、技巧和常见问题. 756
18.1 典型事件的频率和额外开销 756
18.2 以49Hz或99Hz为采样频率 760
18.3 黄猪和灰鼠 760
18.4 开发目标软件 762
18.5 学习系统调用 763
18.6 保持简单 764
18.7 事件缺失 764
18.8 调用栈缺失 766
18.9 打印时符号缺失(函数名称) 767
18.10 跟踪时函数缺失 768
18.11 反馈回路 769
18.12 被丢掉的事件 769
附录A bpftrace单行程序770
附录B bpftrace备忘单775
附录C BCC工具的开发778
附录D C.BPF. 793
附录E BPF指令812
前 言
“扩展版 BPF 的使用案例 :……真疯狂啊。” ——Alexei Starovoitov,新 BPF 的创建者,2015 年 2 月
2014 年 7 月,Alexei Starovoitov 到访了 Netflix 公司位于加州 Los Gatos 的办公室,对他开发的一项有趣的技术进行研讨 :扩展版的伯克利数据包过滤器(简写为 eBPF 或者 BPF)。BPF 是一项用于改进包过滤的冷门技术,此时 Alexei 已经有了对其在包过滤之外的领域进行扩展的远见卓识。Alexei 和另外一名网络工程师 Daniel Borkmann 并肩协作,将 BPF 改写为一个通用的虚拟机,可以运行高级的网络程序和其他类型的程序。
这是一个令人惊叹的想法。有一种使用场景令我十分感兴趣,那就是可以将 BPF 用在开发性能分析的工具上,我看到了 BPF 能够提供我所需要的可编程能力。于是我们做了一个约定 :如果 Alexei 能够将 BPF 与数据包之外的东西相连接,我将使用它来开发性能分析工具。
BPF 现在已经可以挂载到任何事件源上,它也成为系统工程领域一项热门的新技术,拥有众多活跃的贡献者。到目前为止,我已经开发并公开了超过 70 个 BPF 性能分析工具,它们在全球范围内得到广泛使用,并且在 Netflix、Facebook 等公司中进入服务器的默认安装软件列表。我还专门为本书单独开发了许多工具,同时也引入不少其他人贡献的工具。很荣幸能够在这本书中为大家分享这些实用的工具,这样你就可以使用它们进行性能分析、故障定位以及其他种种工作。
作为一名性能工程师,我常沉迷于使用各种工具之中。系统中的盲点是性能瓶颈和软件 bug 的藏身之处。我早先在工作中使用过 DTrace 技术,在 2011 年我编写了 DTrace :Dynamic Tracing in Oracle Solaris,Mac OS X,and FreeBSD 一书(由 Prentice Hall 出版,以下简称为“DTrace 一书”),在那本书中分享了我为这些操作系统开发的工具。现在能够分享 Linux 下的类似工具 — 甚至可以做得更多、看到更多 — 我感到十分兴奋。
为什么你需要BPF性能工具
BPF 性能工具可以帮助你改进性能、降低开销、解决软件问题,从而使系统和应用的效益最大化。它们能比传统性能工具分析得更多,并允许你向生产环境中的系统随意提出问题,并且能够立刻得到答案。
关于本书
本书是关于应用在可观测性和性能分析领域的 BPF 工具的,但是这些工具也有其他用途 :软件故障排查、安全分析等。学习 BPF 最困难的部分不在于写代码 :你可以在一天的时间内学会编写接口程序。困难之处在于如何应用 :在数以千计的可用事件中,你能够从中得到什么信息?本书会帮助你回答这些问题,通过给出性能分析的一些必要的背景,然后使用 BPF 性能工具对许多不同的软硬件目标进行分析,并附上 Netflix 服务器上的样例输出。
BPF 的可观测性是一种超能力,不过这仅仅是因为它扩展了我们对系统和应用的可观测能力,而非重复这种能力。为了高效地使用 BPF,你需要理解什么时候使用传统的性能分析工具,包括 iostat(1) 和 perf(1),什么时候使用 BPF 工具。本书也会介绍传统的工具,可能对于解决某些性能问题它们已经够用了,当不能解决时,它们也会提供有用的上下文和线索,指导进一步使用 BPF 工具。
本书中的许多章节包含了学习目标,告知读者哪些是学习要点。本书中的材料也用在 Netflix 关于使用 BPF 分析的内部课程中,有些章节还包含了可选的练习。
本书中的许多 BPF 工具来自 BCC 和 bpftrace 的代码仓库,这两个项目是 Linux 基金会下的 IO Visor 项目。它们是开源的,可以自由使用,不仅可以从项目的网站上下载,而且很多 Linux 发行版中已经包含了它们。我也为本书新写了一些 bpftrace 工具,并把它们的源代码一并包含到本书中。
这些工具并不是为了演示各种 BPF 功能而随意创建的,创建它们是为了在生产环境中使用。我使用这些工具解决的生产问题超出了当前分析工具集的能力。
对于用 bpftrace 编写的工具,本书已经包含了源代码。如果你希望修改或开发新的bpftrace 工具,则可以从第 5 章中学习 bpftrace 语言,也可以从本书的许多源代码清单中学习。这些源代码有助于说明每个工具的功能以及它们所检测的事件 :就像包含可以运行的伪代码一样。
BCC 和 bpftrace 前端已经趋于成熟,但是将来的变更可能会导致本书中包含的某些源代码停止工作,并且需要更新。如果工具来源于 BCC 或 bpftrace,请检查那些存储库中的更新版本。如果工具来源于本书,请访问本书的网站(参见链接 1 1 )。最重要的不是某个工具有效,而是你了解该工具并让它能够工作。 BPF 跟踪最困难的部分是要知道用它来做什么 ;甚至损坏的工具也会是有用想法的来源之一。
新工具
为了给你提供一整套全面的分析工具,并且出于可用于代码示例的目的,本书共开发了 80 多种新工具。其中许多如图 P-1 所示。 在此图中,先前存在的工具以黑色文本显示,为该书创建的新工具则以灰色显示。本书同时涵盖了既有工具和新工具,尽管后面的许多图都没有使用灰色 / 黑色方案来区分它们。
关于图形界面(GUI)
一些 BCC 工具已经成为测量工具 GUI 的数据来源 — 提供时间序列数据来绘制折线图,提供调用栈来绘制火焰图,或者提供秒粒度的直方图以绘制热力图等。我预期未来会有更多的人通过 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 工具,以及开发新的 bpftrace 工具,但不涉及开发新的 BCC 工具。 BCC 源代码通常很长,无法在书中直接包含,但是附录 C 中提供了一些示例作为可选内容供读者参考。附录 D 中提供了使用 C 语言进行编程的示范,附录 E中提供了使用 BPF 指令进行工具开发的示例,对那些希望更深入了解 BPF 工具的工作原理的人来说,这些示例也可能有用。
本书并不专门针对某种特定语言或应用程序的性能进行分析,因为这方面已经有其他书籍了,它们涵盖了对应语言调试和分析工具的介绍。使用其他工具和 BPF 工具联合解决问题是很常见的,不同的工具之间可以互补,提供不同的解决问题的线索。本书介绍了来自 Linux 的基本系统分析工具,因此你可以利用这些工具直接解决一些问题,如果需要进一步分析,再转向使用提供进一步观察能力的 BPF 工具。
本书简要介绍了每个分析目标的背景和策略。这些主题在我之前出版的那本《性能之巅 :洞悉系统、企业与云计算》 [Gregg 13b] 书中有较详细的解释。
本书的结构
本书分为三个部分。第 1 部分 :第 1 至 5 章,介绍了 BPF 跟踪所需的背景知识,包括性能分析、内核跟踪技术以及两个主要的 BPF 跟踪前端实现 — BCC 和 bpftrace。
第 2 部分包含第 6 至 16 章,涵盖 BPF 可跟踪的目标:CPU、内存、文件系统、磁盘 I/O、网络、安全、语言、应用程序、内核、容器和虚拟机管理器等。尽管你可以按顺序学习这些章节,但本书设计为支持跳至你感兴趣的章节。这些章节遵循同样的结构:背景讨论、分析策略建议以及特定的 BPF 工具。文中还包含了一些可以帮助读者理顺分析思路的图表。
最后一部分,包含第 17 章和第 18 章,涵盖了一些其他主题:其他 BPF 工具以及提示、技巧和常见问题。
附录提供了 bpftrace 单行程序和 bpftrace 速查表,介绍了 BCC 工具开发,包括通过perf(1)(Linux 工具)进行的 C BPF 工具开发以及 BPF 指令摘要。
本书使用了许多术语和缩写,在需要的地方会对它们进行解释。
有关更多信息源,请参见本前言结尾处的“补充材料和参考资料”部分。
目标读者
本书的写作初衷是希望对各种角色的人都有用。无须任何编码即可使用本书中的BPF 工具 :你可以将其用作可以运行的预编写工具表。如果确实想编写代码,则本书中包含的所有代码和第 5 章的内容将帮助你学习快速编写自己的工具。
你不必具备性能分析的背景知识,每章会简述必要的背景知识细节。
本书的特定读者包括 :
? 负责生产系统的系统管理员、站点可靠性工程师、数据库管理员、性能工程师和支持人员可以将本书用作诊断性能问题、了解资源使用情况以及对问题进行故障排除的指南。
? 应用程序开发人员可以使用这些工具来分析自己的代码,并检测代码以及系统事件。例如,可以检查触发磁盘 I/O 事件的应用程序代码。这样可以在无法直接查看内核事件的应用程序特定工具之外,提供一个更完整的行为视图。
? 安全工程师可以学习如何监控所有的事件以发现可疑行为,并创建正常活动的白名单(请参见第 11 章)。
? 性能监控开发者可以使用本书来获得有关在其产品中添加新的可观测性的想法。
? 内核开发人员可以学习如何编写 bpftrace 单行程序来调试自己的代码。
? 学习操作系统和应用程序的学生可以使用 BPF 工具以新的和自定义的方式分析正在运行的系统。学生无须学习抽象的内核技术,而是可以对其进行跟踪并实时了解它们的运行方式。
为了使本书能够专注于 BPF 工具的应用,假定你具备极少的关于所涉及主题的知识储备,包括互联网(例如,IPv4 地址是什么)和命令行用法。
评论
还没有评论。