前言
有已知的已知;有些事情我们知道自己知道。
我们也知道有已知的未知;这是指我们知道有些事情自己不知道。
但是还有未知的未知——有些事情我们不知道自己不知道。
——美国国防部长 唐纳德·拉姆斯菲尔德 2002年2月12日
虽然上述的发言在新闻发布会上引来了记者的笑声,但是它总结出了一个重要的原则,适用于任何如地缘政治般复杂的技术系统:性能问题可能来源于任何地方,包括系统中因你一无所知而不曾检查的地方(未知的未知)。本书将揭示许多这样的领域,并为其分析提供方法和工具。
关于本书
欢迎来到《性能之巅:洞悉系统、企业与云计算》!本书以操作系统为背景讲解操作系统和应用程序的性能,针对企业环境和云计算环境编写而成。本书的目的是帮助你更好地利用自己的系统。
当你的工作与持续开发的应用程序软件为伍,你可能会认为内核经过几十年的开发调整,操作系统的性能已是一个解决了的问题了,但事情并非如此!操作系统是一个复杂的软件体,管理着各种不断变化的物理设备,应对着不同的新应用程序的工作负载。内核也在持续地发展,不断增加新的特性以提高特定的工作负载的性能,随着系统继续扩展,所遇到的瓶颈被逐一移除。改进操作系统性能需要不断的分析和努力,这样才能带来性能的持续提升。应用程序的性能也可以在操作系统的背景下做分析,此点本书也覆盖了。
操作系统范围
本书的重点就是系统性能的研究,所用的工具、示例,乃至可调的参数都是Linux 系统和基于Solaris 的系统里的。除非注明,在示例中所用到的操作系统的特定发行版并不重要。基于Linux 的系统,示例所含的范围从各种裸机系统到虚拟化的运行着Ubuntu、Fedora 或CentOS的云租户。对于基于Solaris 的系统,示例也是裸机系统以及基于Joyent SmartOS 或OmniTI OmniOS 的虚拟化系统。SmartOS 和OmniOS 用的是开源的illumos 内核:这是OpenSolaris 内核的一个活跃的分支,所基于的开发版本后来成为了Oracle Solaris 11。
覆盖两种不同的操作系统给每位读者提供了一个新的视角,帮助读者可以更深入地理解这两种系统的特点,尤其是二者设计不同的地方,并且可以帮助读者更全面地理解性能,而不只局限于某个单一的系统,这样读者可以更加客观地思考操作系统。
过去,开发者对基于Solaris 的系统做了较多的性能工作,让其成为某些情形下更好的选择。Linux 的情况也有了很大的改观。在十多年前的System Performance Tuning [Musumeci 02]出版时,作者同时介绍了Linux 和Solaris,但是更侧重后者。作者的理由是:
Solaris 机器更多地注重性能。我怀疑这是因为Sun 的系统平均来说要比同等的Linux 系统贵得多。这带来的结果是,花大价钱的人更倾向于挑剔性能,因此Solaris 在这个领域做的工作更多。如果你的Linux 机器性能不够好,你可以再买一台并对工作负载做切分——毕竟便宜。如果花了你几百万美金的Ultra Enterprise 10000 性能不好,你公司也因此会每时每刻都在承受不小的损失,你会打Sun 的服务电话寻求答案。
上面这段解释了Sun 注重性能的历史传统:Solaris 的利润是与硬件销售绑定的,不少资金频繁地花在性能的提升上。Sun 需要,也付得起,雇用超过100 名的全职性能工程师(包括我自己和穆苏梅奇(Musumeci Gian))。与Sun 的内核工程师团队一起,我们在系统性能领域取得了许多进展。
Linux 在性能工作和观测工具这一块走了很长的路。尤其是现在,Linux 正在应用到大型的云计算环境之中。本书涵盖了许多Linux 的性能特性,这些特性都是在过去五年里开发起来的。
其他内容
示例会包括性能工具的截屏,这样做不仅是为了显示数据,而且是为了对可用的数据类型做阐释。一般来说工具展现数据的方式更为直观,很多UNIX 早期风格的工具生成的输出都是相近的,意义常常可以不言自明。这意味着屏幕截图可以很好地传递这些工具的意图,只有某些需要极少的附加说明。(如果一款工具需要费力的说明,这就很可能是一个失败的设计!)
技术的历史演化所展示出的洞察力能深化你的理解,这些都会在书中一一讲到。除此之外,了解一些这个行业的重要人物也是很用的(这个世界很小):你很可能会碰到他们或者接触到他们在性能领域的工作成果。附录G 是一张“谁是谁”的清单。
什么未提及
本书着眼于性能。如果你要执行所有的示例任务,有时可能需要做些系统管理员的工作,包括软件的安装或编译(这些本书没有提及)。尤其是在Linux 上,你需要安装sysstat 软件包,还有很多书中用到的工具也有同样的要求。
书中关于操作系统内部总结的内容会在单独的篇章中有详尽的介绍。对性能分析高阶专题的概述,是为了让你知道这些内容的存在,以便在需要的时候依靠其他的知识来源做进一步的学习。
本书的结构
本书的内容如下。
第1章,绪论。介绍系统性能分析,总结关键的概念并展示了与性能相关的一些例子。
第2章,方法。性能分析和调整的背景知识,包括术语、概念、模型、观测和实验的方法,容量规划,分析,以及统计。
第3章,操作系统。总结了内核内部的性能分析。对于解释和理解操作系统行为,这些是必要的背景知识。
第4章,观测工具。介绍系统观测工具的类型,以及构建这些工具所基于的接口和框架。
第章,应用程序。讨论了应用程序性能的内容,并从操作系统的角度观测应用程序。
第6章,CPU。内容包括处理器、硬件线程、CPU 缓存、CPU 互联,以及内核调度。
第7章,内存。虚拟内存、换页、swapping、内存架构、总线、地址空间和内存分配器。
第8章,文件系统。文件系统I/O 性能,包括涉及的不同缓存。
第9章,磁盘。内容包括存储设备、磁盘I/O 工作负载、存储控制器、RAID,以及内核I/O子系统。
第10章,网络。 网络协议、套接字、接口,以及物理连接。
第11章,云计算。介绍广泛应用于云计算的操作系统级和硬件级虚拟化方法,以及这些方法的性能开销、隔离和观测特征。
第12章,基准测试。介绍如何精确地做基准测试,如何解读别人的基准测试结果。这是一个棘手的话题,这一章会告诉你怎样避免常见的错误,并试图理解这一点。
第13章,案例研究。包含一个系统性能的案例研究,讲述了如何从始至终地分析一个真实的云客户案例。
第1~4章提供了必要的背景知识。阅读完这几章后,你可以根据需要参考本书的其余部分。
第13章的写法是不同的,该章用讲故事的方法描绘了性能工程师的工作场景。如果你是性能分析的新手,想先了解个大概,可能会想先读读这一章,当读完其他章的时候还可以再次重温。
作为未来的参考
通过着力于系统性能分析的背景知识与方法,本书的编写经得起推敲。
为了做到这一点,许多章都被分为了两个部分。一部分的内容组成是术语、概念和方法(一般附有标题),这些内容许多年后应该还依然中肯适用。另一部分的内容是前一部分如何实现的示例:架构、分析工具,还有可调参数。这部分内容即便有朝一日淘汰了,作为示例讲解也是依然有用的。
跟踪示例
我们经常需要深入探索操作系统,这项工作要用到内核跟踪工具。有很多这样的工具,它们所针对的开发阶段也各不相同,例如,ftrace、perf、DTrace、SystemTap、LTTng 和ktap。其中有一款工具被选择用在了绝大多数的跟踪示例中,并在Linux 和基于Solaris 的系统上都有演示:它就是DTrace。该工具提供了这些示例所需要的功能,并且关于它还有大量的外部参考资料,包括可以用于高级跟踪的脚本。
你可能需要或愿意选用别的跟踪工具,这很好。DTrace 的示例展示的是你能向系统掷出的问题。这些问题以及提出这些问题的方法,常常才是最困难的。
目标受众
本书的目标受众主要是系统管理员以及企业与云计算环境的运维工程师。所有需要了解操作系统和应用程序性能的开发人员、数据库管理员和网站管理员都适合参阅本书。
作为云计算提供商的首席性能工程师,我的工作会与支持人员和顾客打交道,他们经常要承受巨大时间压力去解决多个性能问题。对于许多人来说,性能并不是他们的主要工作,但却需要了解足够多的性能知识来解决手头的问题。因为清楚读者学习本书的时间会非常有限,我将本书编写得尽可能简洁。但不会简短:有太多知识需要覆盖才能保证你是准备好了的。
另一个受众群体是学生:本书适合作为系统性能课程的补充教材。在本书的编写期间(以及开始动笔的多年以前)我就曾经教授过这样的课程,并帮助学生解决仿真的性能问题(事前不会公布答案!)。这段经历帮我弄清了什么样的材料能最好地引导学生解决性能问题,这也成就了本书的部分内容。
无论你是不是学生,每章的习题都会带给你一个审视和应用知识的机会。其中有一些可选的高阶练习,可能你完成不了(也许做不到,但至少可以启发思维)。
本书涵盖了足够的知识细节,无论是大公司还是小公司,乃至雇用了不少性能专职人员的公司,本书都可以满足其需要。对于众多的小型公司,日常用到的可能只是书中的某些部分,但本书作为参考也可备不时之需。
排版约定
本书贯穿始终用到的排版约定如下:
补充材料与参考
下面选出的书籍(完整的列表见参考书目)可以作为操作系统背景知识和性能分析学习的更为深入的参考。