猜你喜欢
BPF Performance Tools(英文版):洞悉Linux系统和应用性能

BPF Performance Tools(英文版):洞悉Linux系统和应用性能

书籍作者:Brendan Gregg ISBN:9787121386947
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:1277
创建日期:2021-10-07 发布日期:2021-10-07
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

本书作为全面介绍 BPF 技术的图书,从 BPF 技术的起源到未来发展方向都有涵盖,不仅系统介绍了 BPF 的编程模型,还完整介绍了两个主要的 BPF 前端编程框架—BCC 和 bpftrace,更给出了一系列实现范例,生动展示了 BPF 技术的实际能力和未来发展前景。
本书的另一个关注方向是 Linux 系统性能和应用程序性能的调优,内容涉及系统性能调优的策略、工具与实践案例,不仅介绍了对应的 BPF 工具,还着重介绍了这些工具如何与 Linux 传统性能工具配合使用,这样读者可以选择最佳方案。
本书介绍的工具小巧精致,并提供了简单易读的源代码,它们充分展现了 BPF 技术的魅力 :安全、高效、快捷的系统扩展力。未来 BPF 技术在 Linux 中的应用场景会越来越多、越来越重要。希望本书能在大家学习 BPF 技术并关注它的发展时提供帮助。

作者简介

Net??ix 资深性能工程师 Brendan Gregg 是 BPF(eBPF)的主要贡献者,他帮助开发和维护了两个主要的 BPF 前端编程框架,开创了 BPF 用于可观测性的先河,并创建了数十种基于 BPF 的性能分析工具。他还编著有畅销书《性能之巅 :洞悉系统、企业与云计算》。

编辑推荐
适读人群 :BPF性能工具将是所有管理员、开发人员、支持人员和其他IT专业人员不可或缺的资源,他们可以在任何企业或云环境中使用任何最新的Linux发行版。

作为BPF技术的开拓者和专家,Brendan Gregg在本书中不仅展示了超过150个可以立即使用的分析工具和调试工具,对这些工具的应用场景进行了分析,还提供了开发自定义工具的分步指南。在本书中,读者可学习到如何分析CPU、内存、存储设备、文件系统、网络、编程语言、应用程序、容器、虚拟机管理器、安全及内核。Gregg带领读者由浅入深地了解从基础工具到进阶工具的使用,帮助读者收集更有用、更深入的技术信息,可以用来优化几乎任何类型的Linux系统和应用程序。

前言


程序员常常说他们“煎了一个补丁”(cook a patch)而不是“实现了一个补丁”(implement a patch)。我从学生时代起就着迷于编程。为了写出好的代码,程序员需要最好的“食材”。虽然各种不同的编程语言提供了不同的组件,也就是“食材”,但是对 Linux 内核编程来说,除了内核代码本身,就没有其他选择了。

2012 年,我需要增加一组内核特性,但是我需要的“食材”并不存在。我完全可以选择在内核中添加一些新的专用代码,这样几年之后还能使用。但是,我决定创建一种“普适的食材”,这样在有经验的程序员手中,它既可以成为内核中二层的网桥,也可以成为三层的网络路由器。

我有一些重要的要求 :“普适的食材”必须和使用者的编程技能无关,可以被安全使用。一个怀着恶意或者经验不足的开发者不应该具备通过它制作病毒的能力。“普适的食材”不应该允许这种情况的发生。

在内核中已经存在一个叫作 BPF(Berkeley Packet Filter,伯克利数据包过滤器)的“食材”具备类似的特性 :一个最小化的指令集,可以在数据被 tcpdump 这样的应用处理之前进行过滤。我借用它的名字称呼这个新的“食材”为eBPF,这里 e 代表扩展版(extended)。

几年之后,eBPF 和经典 BPF 的差距已经消失了。我的“普适的食材”已经完全替代了原来的 BPF。很多知名的公司基于它建造了庞大的系统,来向包括你和我在内的数十亿用户提供服务。它具有的安全性原则允许许多“厨师”成长为世界级大厨。

第一个 BPF“大厨”就是 Brendan Gregg。他敏锐地发现,除了应用于网络和安全领域,BPF 亦可作为性能分析、监视和可观测性的工具。不过创造这些工具然后再对它们的性能进行解释,对实践和知识的要求是很高的。

我衷心希望本书能够成为读者最心爱的“菜谱”,在这里你可以向厨神学习如何在Linux 厨房中使用 BPF。


Alexei Starovoitov 2019 年 8 月于美国华盛顿州西雅图市




前 言



“扩展版 BPF 的使用案例 :……真疯狂啊。”

Alexei Starovoitov,新 BPF 的创建者,2015 年 2 月


2014 年 7 月,Alexei Starovoitov 到访了 Net?ix 公司位于美国加州 Los Gatos 的办公室,对他开发的一项有趣的技术进行研讨 :扩展版的伯克利数据包过滤器(简写为eBPF 或者 BPF)。BPF 是一项用于改进包过滤的冷门技术,此时 Alexei 已经有了对其在包过滤之外的领域进行扩展的远见卓识。Alexei 和另外一名网络工程师 Daniel Borkmann 合作,将 BPF 改写为一个通用的虚拟机,可以运行高级的网络程序和其他程序。这是一个令人惊叹的想法。有一种使用场景令我十分感兴趣,那就是可以将 BPF 用在开发性能分析的工具上,我看到了 BPF 能够提供我所需要的可编程能力。于是我们做了一个约定: 如果 Alexei 能够将 BPF 与数据包之外的东西相连接,我将使用它来开发性能分析工具。

BPF 现在已经可以挂载到任何事件源上,它也成为系统工程领域一项热门的新技术, 拥有众多活跃的贡献者。到目前为止,我已经开发并公开了超过 70 个 BPF 性能分析工具, 它们在全球范围内得到广泛使用,并且在 Net?ix、Facebook 等公司中进入服务器的默认安装软件列表。我还专门为本书单独开发了许多工具,同时也引入不少其他人贡献的工具。很荣幸能够在这本书中为大家分享这些实用的工具,这样你就可以使用它们进行性能分析、故障定位以及其他种种工作。

作为一名性能工程师,我常沉迷于使用各种工具之中。系统中的盲点是性能瓶颈和软件 bug 的藏身之处。我早先在工作中使用过 DTrace 技术,在 2011 年我编写了 DTrace : Dynamic Tracing in Oracle Solaris,Mac OS X,and FreeBSD 一书(由 Prentice Hall 出版,以下简称为“DTrace 一书”),在那本书中分享了我为这些操作系统开发的工具。现在能够分享 Linux 下的类似工具—甚至可以做得更多、看到更多—我感到十分兴奋。


为什么你需要BPF性能工具

BPF 性能工具可以帮助你改进性能、降低开销、解决软件问题,从而使系统和应用的效益最大化。它们能比传统性能工具分析得更多,并允许你向生产环境中的系统随意提出问题,并且能够立刻得到答案。


关于本书

本书是关于应用在可观测性和性能分析领域的 BPF 工具的,但是这些工具也有其他用途 :软件故障排查、安全分析等。学习 BPF 时,最困难的部分不在于写代码 :你可以在一天的时间内学会编写接口程序。困难之处在于如何应用:在数以千计的可用事件中, 你能够从中得到什么信息?本书会帮助你回答这些问题,通过给出性能分析的一些必要的背景,然后使用 BPF 性能工具对许多不同的软硬件目标进行分析,并附上 Net?ix 服务器上的样例输出。

BPF 的可观测性是一种超能力,不过这仅仅是因为它扩展了我们对系统和应用的可观测能力,而非重复这种能力。为了高效地使用 BPF,你需要理解什么时候使用传统的性能分析工具,包括 iostat(1) 和 perf(1),什么时候使用 BPF 工具。本书也会介绍传统的工具,对于解决某些性能问题它们可能已经够用了,当不能解决时,它们也会提供有用的上下文和线索,指导进一步使用 BPF 工具。

本书中的许多章节包含了学习目标,告知读者哪些是学习要点。本书中的材料也用在 Net?ix 关于使用 BPF 分析的内部课程中,有些章节还包含了可选的练习。

本书中的许多 BPF 工具来自 BCC 和 bpftrace 的代码仓库,这两个项目是 Linux 基金会下的 IO Visor 项目。它们是开源的,可以自由使用,不仅可以从项目的网站上下载, 而且很多 Linux 发行版中已经包含了它们。我也为本书新写了一些 bpftrace 工具,并在本书中提供了它们的源代码。

这些工具并不是为了演示各种 BPF 功能而随意创建的,创建它们是为了在生产环境中使用。我使用这些工具解决的生产问题超出了当前分析工具集的能力。

对于用 bpftrace 编写的工具,本书已经提供了源代码。如果你希望修改或开发新的bpftrace 工具,则可以从第 5 章中学习 bpftrace 语言,也可以从本书的许多源代码清单中学习。这些源代码有助于说明每个工具的功能以及它们所检测的事件 :就像包含可以运行的伪代码一样。

BCC 和 bpftrace 前端编程框架已经趋于成熟,但是将来的变更可能会导致本书中包含的某些源代码需停用并更新。如果工具来源于 BCC 或 bpftrace,请检查那些存储库中的更新版本。如果工具来源于本书,请访问本书的网站(参见链接 11)。最重要的不是知晓某个工具有效,而是你了解该工具并让它能够工作。 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 工具。

本书简要介绍了每个分析目标的背景和策略。这些主题在我之前出版的那本《性能之巅 :洞悉


目录

Part I: Technologies

1 Introduction 1

1.1 What Are BPF and eBPF? 1

1.2 What Are Tracing, Snooping, Sampling, Profiling, and

Observability? 2

1.3 What Are BCC, bpftrace, and IO Visor? 3

1.4 A First Look at BCC: Quick Wins 4

1.5 BPF Tracing Visibility 6

1.6 Dynamic Instrumentation: kprobes and uprobes 8

1.7 Static Instrumentation: Tracepoints and USDT 9

1.8 A First Look at bpftrace: Tracing open() 10

1.9 Back to BCC: Tracing open() 12

1.10 Summary 14

2 Technology Background 15

2.1 BPF Illustrated 15

2.2 BPF 16

2.3 Extended BPF (eBPF) 17

2.3.1 Why Performance Tools Need BPF 19

2.3.2 BPF Versus Kernel Modules 21

2.3.3 Writing BPF Programs 22

2.3.4 Viewing BPF Instructions: bpftool 23

2.3.5 Viewing BPF Instructions: bpftrace 30

2.3.6 BPF API 31

2.3.7 BPF Concurrency Controls 35

2.3.8 BPF sysfs Interface 36

2.3.9 BPF Type Format (BTF) 37

2.3.10 BPF CO-RE 37

2.3.11 BPF Limitations 38

2.3.12 BPF Additional Reading 38

2.4 Stack Trace Walking 39

2.4.1 Frame Pointer–Based Stacks 39

2.4.2 debuginfo 40

2.4.3 Last Branch Record (LBR) 40

2.4.4 ORC 40

2.4.5 Symbols 41

2.4.6 More Reading 41

2.5 Flame Graphs 41

2.5.1 Stack Trace 41

2.5.2 Profiling Stack Traces 41

2.5.3 Flame Graph 42

2.5.4 Flame Graph Features 44

2.5.5 Variations 44

2.6 Event Sources 45

2.7 kprobes 46

2.7.1 How kprobes Work 46

2.7.2 kprobes Interfaces 47

2.7.3 BPF and kprobes 48

2.7.4 kprobes Additional Reading 49

2.8 uprobes 49

2.8.1 How uprobes Work 49

2.8.2 Uprobes Interfaces 51

2.8.3 BPF and uprobes 51

2.8.4 uprobes Overhead and Future Work 52

2.8.5 uprobes Additional Reading 52

2.9 Tracepoints 53

2.9.1 Adding Tracepoint Instrumentation 53

2.9.2 How Tracepoints Work 55

2.9.3 Tracepoint Interfaces 56

2.9.4 Tracepoints and BPF 56

2.9.5 BPF Raw Tracepoints 57

2.9.6 Additional Reading 58

2.10 USDT 58

2.10.1 Adding USDT Instrumentation 58

2.10.2 How USDT Works 60

2.10.3 BPF and USDT 61

2.10.4 USDT Additional Reading 61

2.11 Dynamic USDT 61

2.12 PMCs 63

2.12.1 PMC Modes 63

2.12.2 PEBS 64

2.12.3 Cloud Computing 64

2.13 perf_events 64

2.14 Summary 65

3 Performance Analysis 67

3.1 Overview 67

3.1.1 Goals 68

3.1.2 Activities 68

3.1.3 Mulitple Performance Issues 69

3.2 Performance Methodologies 69

3.2.1 Workload Characterization 70

3.2.2 Drill-Down Analysis 71

3.2.3 USE Method 72

3.2.4 Checklists 72

3.3 Linux 60-Second Analysis 73

3.3.1 uptime 73

3.3.2 dmesg | tail 74

3.3.3 vmstat 1 74

3.3.4 mpstat -P ALL 1 75

3.3.5 pidstat 1 75

3.3.6 iostat -xz 1 76

3.3.7 free -m 77

3.3.8 sar -n DEV 1 77

3.3.9 sar -n TCP,ETCP 1 78

3.3.10 top 78

3.4 BCC Tool Checklist 79

3.4.1 execsnoop 80

3.4.2 opensnoop 80

3.4.3 ext4slower 80

3.4.4 biolatency 81

3.4.5 biosnoop 81

3.4.6 cachestat 82

3.4.7 tcpconnect 82

3.4.8 tcpaccept 82

3.4.9 tcpretrans 83

3.4.10 runqlat 83

3.4.11 profile 84

3.5 Summary 84

4 BCC 85

4.1 BCC Components 86

4.2 BCC Features 86

4.2.1 Kernel-Level Features 87

4.2.2 BCC User-Level Features 87

4.3 BCC Installation 88

4.3.1 Kernel Requirements 88

4.3.2 Ubuntu 88

4.3.3 RHEL 89

4.3.4 Other Distributions 89

4.4 BCC Tools 89

4.4.1 Highlighted Tools 90

4.4.2 Tool Characteristics 91

4.4.3 Single-Purpose Tools 91

4.4.4 Multi-Purpose Tools 93

4.5 funccount 94

4.5.1 funccount Examples 94

4.5.2 funccount Syntax 97

4.5.3 funccount One-Liners 97

4.5.4 funccount Usage 98

4.6 stackcount 99

4.6.1 stackcount Example 99

4.6.2 stackcount Flame Graphs 100

4.6.3 stackcount Broken Stack Traces 101

4.6.4 stackcount Syntax 102

4.6.5 stackcount One-Liners 102

4.6.6 stackcount Usage 103

4.7 trace 104

4.7.1 trace Example 104

4.7.2 trace Syntax 105

4.7.3 trace One-Liners 106

4.7.4 trace Structs 107

4.7.5 trace Debugging File Descriptor Leaks 107

4.7.6 trace Usage 109

4.8 argdist 110

4.8.1 argdist Syntax 111

4.8.2 argdist One-Liners 112

4.8.3 argdist Usage 113

4.9 Tool Documentation 114

4.9.1 Man Page: opensnoop 115

4.9.2 Examples File: opensnoop 118

4.10 Developing BCC Tools 119

4.11 BCC Internals 120

4.12 BCC Debugging 121

4.12.1 printf() Debugging 122

4.12.2 BCC Debug Output 124

4.12.3 BCC Debug Flag 125

4.12.4 bpflist 126

4.12.5 bpftool 127

4.12.6 dmesg 127

4.12.7 Resetting Events 127

4.13 Summary 128

5 b


短评

这是一本非常好的书,BPF或许可能和Dtrace一样,没广泛使用,但它是好的技术,我们国家缺乏这样的想法和技术

2021-02-03 23:24:21