BPF Performance Tools

资源上传时间: 1年以前  | 下载次数:265 次
  • ISBN:-
  • 出版社:-
  • 出版时间:-
  • 图书语言:-
  • 图书作者:-

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

Book cover 这本书既可以作为一个学习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