本书以操作系统为背景讲解操作系统和应用程序的性能问题,针对企业环境和云计算环境编写而成。本书的目的是帮助你更好地利用自己的系统。
当你的工作与持续开发的应用程序为伍时,你可能会认为内核经过几十年的开发调整,操作系统的性能问题早已解决,但事情并非如此!操作系统是一个复杂的软件体,管理着各种不断变化的物理设备,应对着不同的新应用程序的工作负载。内核也在持续地发展,不断增加新的特性以提高特定的工作负载的性能,随着系统继续扩展,所遇到的瓶颈被逐一移除。一些内核变化,如 2018 年的 Meltdown 漏洞的缓解措施,也会损害性能。分析并努力提高操作系统的性能是一项可以不断进行的持续任务。在操作系统的上下文中做应用程序的性能分析,可以找到更多的线索,而这些线索很可能被只针对应用程序的工具所遗漏,这些我在本书中会进行介绍。
操作系统的范围
本书的重点就是系统性能的研究,以英特尔处理器上基于 Linux 的操作系统为主要例子。本书的内容结构也有助于你对于其他内核和处理器的学习。
除非另有说明,具体的 Linux 发行版本在本书所使用的例子中并不重要。这些例子大多来自 Ubuntu 发行版,必要时会有注解说明它与其他发行版的差异。这些例子也取自各种系统类型 :裸机和虚拟化,生产环境和测试环境,服务器和客户设备。
在我的职业生涯中,我与各种不同的操作系统和内核打过交道,这加深了我对操作系统和内核设计的理解。为了加深你的理解,本书也会提及一些 UNIX、BSD、Solaris 和 Windows 的内容。
其他内容
本书中的示例会包括性能工具的截屏,这样做不仅是为了显示数据,而且是为了对可用的数据类型进行阐释。一般来说,工具展现数据的方式更为直观,很多 UNIX 早期风格的工具生成的输出都是相近的,意义常常不言自明。这意味着屏幕截图可以很好地传递这些工具的意图,其中的一些可能仅需要极少的附加说明。(如果一款工具需要费力地进行说明,它就很可能是一个失败的设计!)
我将触及某些技术的历史,这能提供有用的见解来加深你的理解。除此之外,了解这个行业的一些重要人物也是很有用的 :你很可能会碰到他们或者接触到他们在性能领域的工作成果。附录 E 是一份关于“名人录”的清单。
本书中的少数主题在我之前的书《BPF 之巅》[Gregg 19] 中也有涉及 :特别是 BPF、BCC、bpftrace、tracepoint、kprobe、uprobe,以及各种基于 BPF 的工具。你可以参考该书以获得更多信息。本书中对这些主题的讲解通常是基于那本较早的书,有时候还使用了相同的文字和例子。
哪些内容未提及
本书着眼于性能。如果你要执行所有的示例任务,有时可能需要做一些系统管理员的工作,包括软件的安装或编译(这些本书没有提及)。书中关于操作系统内部总结的内容会在单独的章节中提供详尽的介绍。对性能分析高阶专题的概述,是为了让你知道这些内容的存在,以便在需要的时候依靠其他的知识来源进一步学习,可参见本前言末尾的“补充材料与参考”部分。
本书的结构
第 1 章,绪论。介绍系统性能分析,总结关键的概念并展示了与性能相关的一些例子。
第 2 章,方法。介绍性能分析和调优的背景知识,包括术语、概念、模型、观测和实验的方法、容量规划、分析,以及统计。
第 3 章,操作系统。总结了内核内部的性能分析知识。对于解释和理解操作系统的行为,这些是必要的背景知识。
第 4 章,观测工具。介绍系统可用的观测工具的类型,以及构建这些工具所基于的接口和框架。
第 5 章,应用程序。讨论了应用程序性能的内容,并从操作系统的角度观测应用程序。
第 6 章,CPU。内容包括处理器、核、硬件线程、CPU 缓存、CPU 互联、硬件互联及内核调度。
第 7 章,内存。本章涉及虚拟内存、换页、交换、内存架构、总线、地址空间和内存分配器。
第 8 章,文件系统。介绍了文件系统 I/O 性能,包括涉及的不同缓存。
第 9 章,磁盘。内容包括存储设备、磁盘 I/O 工作负载、存储控制器、RAID,以及内核 I/O 子系统。
第 10 章,网络。内容涉及网络协议、套接字、接口,以及物理连接。
第 11 章,云计算。介绍了广泛应用于云计算的操作系统级和硬件级虚拟化方法,以及这些方法的性能开销、隔离和观测特征。这一章涵盖了管理程序和容器。
第 12 章,基准测试。介绍了如何精确地做基准测试,如何解读别人的基准测试结果。这是一个棘手的话题。这一章会告诉你怎样避免常见的错误,并试图理解它们。
第 13 章,perf。介绍了标准的 Linux 剖析器 perf(1),以及它的诸多功能。这是perf(1) 在全书中的使用参考。
第 14 章,Ftrace。介绍了标准的 Linux 跟踪器 Ftrace,Ftrace 特别适用于探索内核代码的执行。
第 15 章,BPF。讲解了标准的 BPF 前端—BCC 和 bpftrace。
第 16 章,案例研究。包含一个来自 Netflix 的系统性能案例,展示了如何从头开始分析一个生产环境性能难题。
第 1 ~ 4 章提供了必要的背景知识。阅读完这几章后,你可以根据需要参考本书的其余部分,特别是第 5 ~ 12 章,其中包括具体的分析目标。第 13 ~ 15 章涵盖了高级分析和跟踪的内容,对于那些希望更详细地了解一种或多种跟踪器的人来说,这是可选的阅读内容。
第 16 章用讲故事的方式来描绘性能工程师的工作场合。如果你是性能分析的新手,这一章作为一个用各种不同工具做性能分析的例子,你可能想先阅读,然后在阅读完其他章节后再回到这一章。
作为未来的参考
本书聚焦于系统性能分析的背景知识与方法,以期为读者带来长久的价值。为了做到这一点,许多章都被分为了两部分。一部分的内容是术语、概念和方法(一般附有标题),这些内容许多年后应该还依然中肯适用。另一部分的内容是前一部分如何实现的示例 :架构、分析工具,还有可调参数。这部分内容即便有朝一日过时了,作为示例进行学习也依然是有用的。
跟踪示例
我们经常需要深入探索操作系统,这项工作要用到内核跟踪工具。自本书第 1 版以来,eBPF 已经被开发出来并合并到 Linux 内核中,为使用 BCC 和 bpftrace 为前端的新一代跟踪工具提供动力。本书的重点是 BCC 和 bpftrace,还有 Linux 内核内置的 Ftrace 跟踪器。BPF、BCC 和 bpftrace 在我之前的书中有更深入的介绍 [Gregg 19]。
本书还涵盖了 Linux 中的 perf,perf 是另一个执行跟踪的工具。然而,perf 被收录在各章节中,通常用于采样和 PMC 分析,而不是用于跟踪。你可能需要或希望选用其他跟踪工具,这很好。本书中的跟踪工具用来展示你能向系统抛出的问题,这些问题及提出这些问题的方法,往往才是最难知道的。
目标受众
本书的目标受众主要是系统管理员及企业与云计算环境中的运维工程师,所有需要了解操作系统和应用程序性能的开发人员、数据库管理员和网站管理员也适合阅读本书。作为在一家拥有大型计算环境的公司(Netflix)工作的性能工程师,我经常与 SRE(站点可靠性工程师)和开发人员一起工作,他们面临着巨大的时间压力,需要解决多个同
时发生的性能问题。我还参加过 Netflix CORE SRE 的轮流值班,亲身经历了这种压力。
对于很多人来说,性能调整不是他们的主要工作,他们了解的知识足够解决当前的问题就行。由于知道读者的时间有限,因此我把这本书写得尽可能短,并在书的结构上便于读者跳到特定的章节。
本书的另一个受众群体是学生 :本书适合作为系统性能课程的补充教材。在本书的编写期间(以及开始动笔的多年以前),我就曾经教授过这样的课程,并帮助学生解决仿真的性能问题(事前不会公布答案!)。这段经历帮我弄清了什么样的材料能最好地引导学生解决性能问题,这也促成了本书的部分内容。
无论你是不是学生,每章的习题都会带给你一个审视和应用知识的机会。其中有一些可选的高阶练习,可能你完成不了(但至少可以启发思维)。
本书涵盖了足够多的知识细节,无论是大公司还是小公司,乃至雇用了不少性能专职人员的公司,本书都可以满足其需要。对于众多的小公司,日常用到的可能只是书中的某些部分,但本书作为参考也可备不时之需。