书评:Understanding Software Dynamics(深入理解软件性能——一种动态视角)—— Richard L. Sites 著

性能分析是一门复杂的学科 —— 在这个领域,任何结论都必须经过严谨的论证、详细的实验数据支撑,并且你必须对自己的结果有极大的信心。在计算机科学领域,我们几乎被劝阻去关注性能问题。经常被引用的 Knuth 名言——“过早优化是万恶之源”——被用来提醒初级开发者不要过分关注琐碎的细节。这种建议大多数时候是出于善意。在学习阶段,完成项目并不断进步比纠结于微小的优化更重要。

但这一点却产生了一个反向影响,使得改进真实系统性能的信息变得难以获取。而完整的 Knuth 名言是:“我们应该在 97% 的时间里忘掉那些微小的效率问题,因为过早优化是万恶之源。然而,我们不应放弃在关键的 3% 时间里进行优化的机会。优秀的程序员不会因此而自满,而是会在识别出关键代码后仔细分析。” 这告诉我们,在某些情况下,我们确实需要关注性能,而深入的调查研究会带来回报。

近年来,有几本我高度评价并多次推荐的性能优化书籍。其中,Brendan Gregg 的 《性能之巅:洞悉系统、企业与云计算》(Systems Performance)(替代了长期以来备受推崇的 DTrace 性能调优书籍)和 《BPF 性能工具》(BPF Performance Tools) 是世界知名的性能分析专家著作,专注于研究和设计工具,以更好地理解真实世界中的系统性能。

另一本相对冷门但同样出色(且开源)的书是 Denis Bakhvalov 的 《现代 CPU 的性能分析与调优》(Performance Analysis and Tuning on Modern CPUs),它深入探讨了 CPU 运行缓慢的原因,以及如何最大化计算机的性能利用率。

Gregg 的书是未来性能专家的优秀入门教材,它们提供了一种高层次的系统分析视角,并指导如何使用工具进行分析。《BPF 性能工具》和《性能之巅:洞悉系统、企业与云计算》不仅提供了性能分析的方法论,还包含了高质量的参考资料,是你排查问题的第一选择。阅读这两本书以及相关工具的源代码,你可以学会如何构建自己的性能分析工具。但需要注意的是,这些书籍并未深入探讨如何设计优秀的性能分析工具。

Bakhvalov 的 《现代 CPU 的性能分析与调优》(Performance Analysis and Tuning on Modern CPUs) 介绍了如何在 Linux 上使用 perf 工具集来分析程序性能。书中涵盖了开发者需要掌握的核心基础知识,以便理解 perf 的输出,并分析影响软件性能的各种因素。这本书同样是一个很好的入门读物,但缺乏扎实的示例(这些示例可以从作者提供的免费课程资料中获取),同时也没有为需要构建自定义调试工具的开发者提供进一步的指导。

相比之下,Richard L. Sites 的《深入理解软件性能——一种动态视角》(Understanding Software Dynamics, USD) 在近年来的相关书籍中尤为突出。它不仅介绍了计算机的基本工作原理及影响其性能的关键因素,还进一步阐述了性能工具在实际系统中需要满足的各种约束条件,以确保其有效性。

作者是一位计算机行业的资深专家,他在 DEC 工作时开发了最早的 CPU 性能指令,并在 Google 和 Tesla 等公司长期从事性能分析工作,研究范围从 CPU 级别的瓶颈到整个数据中心的应用栈。USD 是探索大型系统性能随动态变化的一个实践指南。在大型系统中,同时存在大量事务,单个事务的性能通常不太重要,而 USD 关注的是事务分布情况。性能问题往往出现在离群值(outliers)上 —— 系统的整体性能由最快和最慢的事务共同决定,USD 指导读者如何找出系统的最佳和最差性能预期,并分析当 90% 分位点(90th percentile)超出这些预期范围时的原因。

USD 以数据中心的 RPC 系统作为核心示例,并构建工具来发现可能出现的性能问题。前七章探讨了性能测量方法以及不同系统组件对最终性能的影响。在此部分,USD 进行了非常深入的细节分析,帮助读者理解为何 CPU 指令、内存、磁盘或网络访问 可能成为系统性能瓶颈。

在整个探讨过程中,书中传达的一个核心理念是:将单个子系统视为独立组件来分析性能并不是一个好的方法。Sites 展示了如何确定计算机子系统的最佳和最差性能,并演示了如何在真实环境中验证这些估算。

USD 的第二部分则关注如何在保持可接受的开销的前提下观察和测量真实系统的性能。在这一部分,读者将学习当前使用的性能分析工具的不同实现方式,以及这些工具所提供的观察机会。同时,本书在这里引入了性能观察工具的设计标准,为读者提供更深层次的理解。

本书的第三部分建立在前两部分介绍的基础上,并通过 KUTrace 框架(一个 内核-用户态 跟踪框架)的引入,展示了实际的跟踪实现。KUTrace 是一个高带宽日志记录框架,必须以低开销方式实现。它为调试运行时间过长的事务提供了额外的信息来源。

KUTrace 是一个 Linux 的补丁集,它为 内核用户态 代码中的特定点提供了小型(约 64 字节)的日志条目框架。默认情况下,跟踪点是 __predict_false 分支,只有在加载 KUTrace 内核模块后,它们才会激活,并开始将日志存入 内核缓冲区USD 详细讲解了 KUTrace 采用的日志条目设计、系统接口以及内核模块的工作方式。

书的最后部分由 九章 组成,每章都围绕前文讨论过的某个性能领域的问题展开实际案例分析。例如:

  • CPU 计算过多

  • CPU 运行速度慢或处于等待状态

  • 内存磁盘网络锁争用时间管理队列 等场景。

这些章节基于前文的理论知识,通过实际问题帮助读者理解 性能瓶颈的成因 以及 如何排查

《深入理解软件性能——一种动态视角》(USD) 是一本出色的书籍,适合任何对 实际系统性能分析 感兴趣的人。它很好地介绍了必要的背景知识,同时不会过于深入到难以跟进的细节。多个章节配有示例,以巩固和扩展前文所讲述的知识,并专注于提升理解能力。

Sites 在全书中保持了清晰的表达方式,书中引用了大量 来自 Google 真实系统示例系统 的高质量示例图表。此外,书中还融入了作者自己在 性能优化 领域的经验,使内容更具实用价值。USD 结构严谨、语言流畅,适合没有 性能分析 经验的读者,也能让有经验的读者从 不同计算机组件的性能细节 以及作者介绍的新工具中获得新知识。


TOM JONESFreeBSD 开发者、《BSDNow Podcast》联合主持人,希望基于 FreeBSD 的项目能够获得应有的关注。他居住在 苏格兰东北部,并提供 FreeBSD 咨询服务。

最后更新于

这有帮助吗?