本篇主要提供BPF之巅:洞悉Linux和应用性能BPF技术背景性能分析BCCbpftrace电子书的pdf版本下载,本电子书下载方式为百度网盘方式,点击以上按钮下单完成后即会通过邮件和网页的方式发货,有问题请联系邮箱ebook666@outlook.com
作为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之巅洞悉Linux和应用性能》作为全面介绍 BPF 技术的图书从 BPF 技术的起源到未来发展方向都有涵盖不仅全面介绍了 BPF 的编程模型还完整介绍了两个主要的 BPF 前端编程框架 — BCC 和 bpftrace更给出了一系列实现范例生动展示了 BPF技术的实际能力和未来发展前景。
本书的另一个关注方向是 Linux性能和应用程序性能的调优。内容涉及性能调优的策略、工具与实践案例不仅介绍了对应的 BPF 工具还着重介绍了这些工具如何与 Linux 传统性能工具进行互补这样读者可以有选择地进行使用。
本书介绍的工具小巧精致并提供了简单易读的源代码它们展示了 BPF 技术的魅力所在 安全、高效、快捷的扩展力。未来 BPF 技术在 Linux 中的应用场景会越来越多越来越重要。希望本书能在大家学习 BPF 技术并关注它的发展时提供帮助。
Brendan Gregg布兰登.格雷格
Netflix性能工程师
Brendan Gregg 是 BPFeBPF的主要贡献者他帮助开发和维护了两个主要的 BPF 前端框架开创了 BPF 用于可观测性的先河并创建了数十种基于 BPF 的性能分析工具。他编著的书有《性能之巅洞悉、企业与云计算》。
译者介绍
孙宇聪曾就职于美国加利福尼亚谷歌总部后先后就任Coding.net技术负责人、火币中国IT负责人及火币美国硅谷研发团队负责人以及Facebook脸书运维技术经理等职位。译有《SRE谷歌运维揭秘》《架构整洁之道》《BPF之巅洞悉Linux和应用性能》等名著曾在软件开发大会、Qcon、架构师峰会、 O'Reilly Velocity等科技峰会进行公开演讲。
吕宏利SRE现任职于谷歌基础架构部。之前曾负责谷歌搜索广告和内容广告运维工作有多年分布式研发与运维经验。对运维工具平台建设、监控、应用性能跟踪及分析、数据化运维等方面有深入的研究。
刘晓舟毕业于北京大学计算机系现供职于字节跳动公司部任架构师。他在字节跳动主持构建了基于 eBPF 的大规模性能分析和网络监控诊断平台闲暇时间也在相关开源社区提交代码。在加入字节跳动之前他有 10 年国家部委电子政务和大数据研究经历。
第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-PilotPCP 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 SolarisMac OS Xand 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 地址是什么和命令行用法。