13.0 概述
本章是对一些事情的思索,包括:Linux性能工具的当前状态,哪些仍需要改进以及为什么Linux是当前一个相当不错的进行性能调查的平台。
阅读本章后,你将能够:
- 了解Linux性能工具箱的漏洞,以及一些理想的解决方案。
- 了解Linux作为性能调查平台的优势。
13.1Linux工具的现状
本书介绍了目前的Linux性能工具,以及怎样单独和一起使用它们来解决性能问题。就Linux的各方面而言,这些性能工具一直在发展,因此进行问题调查时,不断查看性能工具的帮助页或文档以确定其用法是否发生变化是一个好习惯。性能工具的基本功能很少改变,但常常会增加一些新功能,因此,对特定工具查看其最新发布的说明和文档是很有帮助的。
13.2Linux还需要什么样的工具
当我们了解一些Linux性能工具时,我们看到了整体性能调查功能中的一些漏洞。有些漏洞是由于内核限制造成的,有些漏洞则仅仅是由于没人编写一个工具来解决这个问题。但是,填补这些漏洞会让调查和修复Linux性能问题变得容易得多。
13.2.1漏洞1:性能统计信息分散
一个明显的漏洞是Linux没有一个单一的工具为特定进程提供所有的相关性能统计信息。在原来的UNIX中,ps可以填补这一漏洞,在Linux中它也很不错,但却不包含其他商业UNIX实现提供的全部统计信息。有些统计信息对追踪性能问题是非常有价值的,比如inblk(读入的I/O块)和oublk(写出的I/O块),它们表示的是一个进程使用的磁盘I/O量;vcsw(自愿的上下文切换)和invcsw(非自愿的上下文切换),它们通常表示一个进程进行CPU上下文切换;msgrcv(从通道和套接字接收的消息)和msgsnd(从通道和套接字发送的消息),它们显示的是一个应用程序使用的网络和通道I/O量。一个理想工具应加上所有这些统计数据,并将迄今为止提到的许多性能工具(包括oprofile、top、ps、strace、Itrace 和/proc文件系统)的功能组合到一个单一的应用程序中。用户应能在进程上使用这个单一的应用程序,抽取所有重要的性能统计数据。每个统计数据都能实时更新,使得用户可以在运行时调试应用程序。它会将某个调查方面的信息分组统计到相同位置。
举个例子,如果我正在调查内存使用情况,它就应该显示到底堆、栈、库、共享内存以及mmap使用了多少内存。假如某个特定内存区域大大超过了我的预期,我可以继续深入调查,而这个性能工具可以告诉我究竟是哪些函数分配了这些内存。如果我正在调查CPU的使用情况,我会从总体统计数据开始,诸如系统时间和用户时间各是多少,某个特定进程有多少个系统调用,之后我将能够更加深入到系统时间或者是用户时间,看看到底是哪些函数消耗了这些时间以及它们被调用的频率。一个高明的shell脚本,利用合适的已存在的工具来收集并整合信息,多花些时间也能实现其中的部分功能,但要完全实现这一愿望,就有必要让一些工具的行为发生根本性的变化。
13.2.2漏洞2:没有可靠并完整的调用树
接下来的性能工具漏洞是目前还没有办法提供应用程序执行的完整的调用树。Linux有几个不完整的实现。oprofile提供了调用树的生成,但它是基于采样的,因此无法捕捉生成的每一个调用。gprof支持调用树,但它无法分析整个应用程序,除非是特定进程调用的每一个库编译时选择支持分析。最有前途的工具valgrind有一个界面称为calltree,详述参见5.2.5节,它的目标是提供一个完全准确的调用树。但是,它还在发展中,且无法适用于所有的二进制文件。
调用树工具是很有用的,即便是当它运行时会明显降低应用程序的性能。常见的使用方法是:先运行oprofile找出应用程序中的哪些函数是"热点",然后运行调用树程序明确为什么应用程序要调用它们。oprofile那一步将提供全速运行时应用程序瓶颈的准确视图,而调用树,即使它运行缓慢,也会显示应用程序是如何调用那些函数以及调用的原因。唯一的问题是,如果程序的行为是时间敏感的,运行缓慢将会导致其行为发生变化(比如那些依赖于网络或磁盘I/O的)。不过,现有的许多问题不是时间敏感的,用准确的调用树机制修复它们还有很长的路要走。
13.2.3漏洞3:IO的归因
最后,当前Linux中最大的漏洞是I/O归因。现在,Linux没有提供好的方法来追踪哪些应用程序使用了最多的磁盘或者甚至是网络I/O。
一个理想的工具应实时显示特定进程使用的磁盘或网络I/O的输入输出字节数。该工具将显示统计数据,如原始带宽,以及子系统能够占用的原始I/O百分比。此外,用户还要能分解统计数据,以便他们可以看到每一个单独网络和磁盘设备都相同的统计信息。
13.3 Linux的性能调优
即使存在上述漏洞,Linux仍然是一个发现并修复性能问题的理想环境。它是由开发人员编写给开发人员的,其结果就是,它对性能调查者非常友好。Linux有几个特点使它成为追踪性能问题的优秀平台。
13.3.1 可用的源代码
首先,开发人员可以访问到整个系统的大多数(如果不是全部)的源代码。如果问题看上去不在你的代码中,那么在追踪问题时这一点就相当有价值。对商用UNIX或其他无法获得源代码的操作系统,你可能需要等待供应商对问题进行调查,如果的确是他的问题,你也无法保证他会修复问题。但是,对Linux而言,你可以自己调查问题,弄清楚为什么性能问题会发生。如果问题不在你的应用程序中,你可以修复它并提交补丁,或是直接运行一个已修复的版本。如果在阅读Linux源代码后,你意识到是你的应用程序有问题,那么你也可以修复问题。不管是哪种情况,你都可以立即进行修复,不会因等待别人而卡壳。
13.3.2 容易联系开发者
Linux的第二个优点是:找到并联系特定应用程序或库的开发人员相对容易。大多数其他专有操作系统很难说清楚哪个工程师负责哪个代码片段,相比之下,Linux要更加开放。通常,特定软件片段开发人员的名字和联系方式都放在软件包中。访问开发人员使你可以咨询一些问题,包括:特定代码段的行为,运行缓慢的代码是干什么用的,以及给定的优化执行起来是否安全。开发人员一般会很乐意就此提供帮助。
13.3.3 Linux还年轻
Linux是性能优化的优秀平台的最后一个理由是它还未成熟,功能仍在开发中,Linux 还有很多机会发现并修复简单的性能缺陷。大多数开发人员关注于添加功能,因此性能问题会被搁置一边不去解决。一个雄心勃勃的性能调查人员可以在不断开发的Linux中发现并修复很多小的性能问题。这些小修复超越了单个个体,惠及整个Linux团体。
13.4本章小结
本章我们研究了Linux性能工具几个集中存在缺点的方面,并提出了一些理想的解决方案。我们还讨论了为什么Linux是一个尝试进行性能调查和优化的好平台。
改变Linux获得更好的性能,这取决于你------读者。提升Linux性能,改进Linux性能工具的机会比比皆是。如果你发现了困扰你的性能问题,修复它,或者向开发人员报告,和他们一起修复它。无论哪种方式,都不会再有人被这个问题卡住,整个Linux团体都会受益。