LWN:《BPF Performance Tools》介绍!

关注了就能看到更多这么棒的文章哦~

A look at "BPF Performance Tools"

By Jake Edge
February 26, 2020

原文来自:https://lwn.net/Articles/813114/

BPF在过去几年在Linux世界中得到了爆发性的增长,不再局限在networking领域,而是变成了一个通用的在kernel中运行定制化程序的方法。它的角色随着各个kernel release不断在扩张,尤其是security和device control领域。不过在Brendan Gregg的新书《BPF Performance Tools》中,这些都不是重点,它的重点是BPF如何让大家能更好地看透kernel的行为。BPF及相关工具可以更好地帮助找到大规模production system(生产系统)中的瓶颈。Gregg的书就在这个领域有很深入地探讨。

LWN:《BPF Performance Tools》介绍!_第1张图片

这本书既可以作为一个学习BPF如何增强Linux system和application的可见性的好方法,也是对Gregg等人建立的分析运行中系统的许多工具的一个参考书。有趣的是,它其实没有多讲底层的BPF虚拟机指令(只在附录中有介绍),而更关注如何在上层来使用BPF。甚至也不太关注如何利用BCC和bpftrace等上层软件来写各种工具(尽管它提供了一些bpftrace示例代码)。这本书主要目的是为了帮助人们在生产环境中查清Linux系统上各个层面的问题。

在综述Linux里的tracing和sampling技术之前,首先介绍了BPF是起源于Berkeley Packet Filter,后来变成了extend BPF (eBPF)。接下来简要展示了如何利用BPF Compiler Collection  (简称BCC)封装好的工具来审查系统里所有的execve()调用,以及block I/O latency。Linux系统里面有好几层的tracing机制,包括上层的application层利用system library和系统调用接口,直到底层的kernel中的tracepoint和硬件计数器(hardware counter),在书中都有介绍,也包含了几个bpftrace的简单命令的例子,一行命令(one-liner)就能完成审查open()或openat()系统调用的任务。Gregg的2019年7月后的LWN文章,以及2019 Linux Storage, Filesystem, and Memory-Management Summit中的报告,都可以看到更多的bpftrace one-liner的例子。

对BPF背景感兴趣的读者在这第一章中可以了解到自己需要的信息。书中包含的这些概念,在Part I "Technologies"中都有更加细致的介绍。写这本书的时候希望大家既可以从头到尾通读,也可以作为各种分析系统问题的工具和技巧的参考书。因此书中这里那里会有一些少量重复,为了尽量避免大家跳着读到这里的时候看不懂。因此对于那些希望按顺序通读下来的读者,可能会有点烦恼,不过对于这种希望满足两种用法目的的书来说,都有这个问题,无法避免。

BPF本身就已经很复杂了,它在kernel中各种地方安置了钩子(hook),才能采集到tracing信息。这些地方有些是static option(比如kernel tracepoint和user-level statically defined tracing (USDT) markers),也包括那些动态注入kernel的方式(例如kprobe),还包括用户态程序user space program(uprobe)。BPF program可以从这些来源(还有其他的硬件性能监控计数器(PMC, performance monitoring counters)和perf_events)获取信息,在kernel中对这些数据进行综合处理,用各种形式展现出来。第二章就对这些内容进行了详细介绍。

BPF比起其他tracing机制的一个主要优势就是它可以在kernel中高效地干活,也能很简单地展示结果。许多其他工具需要在memory或者log文件中存放许多数据,然后对这些数据进行二次处理来提取用户感兴趣的信息。有些工具还要在kernel中增加额外代码(例如更改kernel config来重新编译kernel,或者插入一个kernel module),BPF并不需要做这些动作。此外,BPF还有一些数据结构和helper function来采集一些大家通常会感兴趣的信息(例如stack traces)。这些内容的介绍也在第二章中。

Gregg写此书时,虽然他的主要目的是介绍如何使用BPF,不过也没有忘记介绍其他一些诊断问题的常用工具。下一章介绍分析系统问题的过程时,首先分析了人们的目标,以及追查问题常用的手段。首先,提供了两种checklist供逐步检查。第一种是利用了标准Linux工具(比如vmstat, pidstat, sar)作为一个一分钟checklist。接下来是一个BCC工具(例如execsnoop, biosnoop, tcpaccept等)组成的checklist。这两个checklist中,每一条都仔细介绍了如何利用输出的信息来确认具体可能是什么问题。BCC工具的描述还提供了其他详细介绍此工具的相关章节的索引。

Part I的两个总结章节是分别介绍了BCC和bpftrace的安装、内部机制、如何使用。每个章节都介绍了几个实例。目前越来越多的Linux发行版都提供了这两种工具的安装包,还包括了许多利用这两种方案的工具。此外还有Gregg专门针对本书开发的许多工具,可以参看下面这个diagram中的红色工具。现有的其他工具用黑色字体。所有新工具都可以在GitHub上获取到:https://github.com/brendangregg/bpf-perf-tools-book

LWN:《BPF Performance Tools》介绍!_第2张图片

本书的第一部分给出了许多背景信息,也让读者见识到了BPF能做的那么多有价值的事情。而本书最有价值的部分其实还是在Part II("Using BPF Tools")。这里有11个独立章节,每个都介绍了系统中一个不同领域,着重于讲清如何利用这些工具以及bpftrace one-liners来看进去这个领域中的内部信息。例如,有章节分别介绍CPU, memory, I/O, networking, security, application, languages (例如Java),containers, hypervisors。

每个章节都会先给出一些背景信息,来帮助大家理解这个领域具体是用来做什么的。还会介绍一下这个场景中的性能等问题受哪些关键因素的影响。针对这些问题,都先用一些例子介绍了调查这些问题的传统工具,展示了这些工具能提供哪些信息。接下来的部分会介绍BPF工具和bpftrace program(例如那些一行命令one-liners),如何利用它们来查清问题。许多章节都提供了一个练习部分,讨论如何来扩展现有的工具,或者利用BCC和bpftrace来写一些新工具,特别是那些标记为“advanced, unresolved”的练习都非常有挑战性。

本书剩下的部分都是一些各种层次的附加材料。Part III("Additional Topics")有一个章节来介绍其他基于BPF的性能分析工具,还有一章讲“Tips, Tricks, and Common Problems”(经验技巧和常见问题)。最后的部分是附录,包括Part II中所介绍过的所有one-liner一行命令程序,一个bpftrace的速查表,关于如何基于BCC和C来开发BPF program的介绍,一个BPF指令集参考。最后是名词表和索引。

关于这本书,我本着鸡蛋里挑骨头的原则找出了一些问题。不过总体来说这本书非常棒,深入地介绍了基于BPF的工具集,以及如何用它们来调查性能问题等各种问题。这本书可能有些地方让你会有挫败感(译者注:就是看不懂!),不过这主要还是要怪罪于这个主题本身比较深入、有挑战性。BPF相关的内容实在太多了,要把它们全部归拢在一起讲清楚,并不是什么简单的事情。

我从出版商这里拿到了本书的一个EPUB版本,所以我试过用平板电脑上的Lithium来读,也试过用台式机的calibre软件来读。我没拿我的Kobo墨水屏读书器试过,毕竟这本书的排版不适合这种黑白小屏来看。用Lithium的时候我碰到一些读其他的技术书籍的时候没有碰到过的问题,一些例子命令或者输出信息可能会超出本页,但是翻到下页的时候就直接跳过这部分了。不过有链接可以让你用全屏模式来看这个部分,然后点击一下就会退出全屏模式回到书中原位。Calibre没有什么问题,估计其他EPUB阅读器应该也不会有什么大问题。不过这个问题不大,不影响我使用Lithium。

这本书有许多有用的脚注,比如介绍了某个特定工具背后的故事以及开发者。不过这些脚注在正文中标记的方括号链接做得不够好,点击的话会跳到全书最后的索引,不过其中每一条都会跳转到一个网页地址上去。这样的话还不如直接点一次就能跳到这个页面。当然,如果把这些链接都删除的话就不会有问题了(纸质书就不受这个影响),不过这样一来又要很麻烦地处理这些索引的页码。希望新版本能使用普通的脚注,直接在电子版里面可以选中跳转,而在纸质版中能生成准确页码。

这本书虽然一直拿性能问题作为首要问题——许多例子都是用48-CPU的系统来展示输出结果的——其实这些技巧和工具对于其他场景也很有价值。在台式机系统中调查问题,或者熟悉kernel内部实现,这两种用法都是本书特别提出建议的。基本上所有运行Linux的用户都可以利用bpftrace one-liner(或者多来几行)就能满足他们的一些好奇心。对于所有那些想知道Linux系统如何工作的人来说,《BPF Performance Tools》这本书绝对值得一读。

全文完

LWN文章遵循CC BY-SA 4.0许可协议。

欢迎分享、转载及基于现有协议再创作~

长按下面二维码关注,关注LWN深度文章以及开源社区的各种新近言论~

你可能感兴趣的:(LWN:《BPF Performance Tools》介绍!)