8.0 概述
本章介绍一些在Linux系统上可用的实用程序,它们能够加强性能工具的有效性和可用性。实用工具本身不是性能工具,但是当它们与性能工具一起使用时,它们可以帮助完成如下功能:自动执行繁琐的任务、分析性能统计数据,以及创建性能工具友好的应用程序。
阅读本章后,你将能够:
- 定期显示并收集性能数据(bash、watch)。
- 记录性能调查过程中所有的命令以及显示的输出(tee、script)。
- 导入、分析性能数据并将其图形化(gnumeric)。
- 确定应用程序使用的库(ldd)。
- 确定链接库中有哪些函数(objdump)。
- 研究应用程序的运行时特征(gdb)。
- 创建性能工具/调试友好的应用程序(gcc)。
8.1性能工具助手
Linux有着丰富的工具,这些工具一起使用比起单个使用之和的功能更强大。性能工具也是一样的,虽然可以单独使用,但是它们与其他Linux工具结合起来就能够显著提升其有效性和易用性。
8.1.1自动执行和记录命令
如同前面章节所述,性能调查中最有价值的步骤之一就是保存在调查过程中发出的命令和产生的结果。这使得你可以在之后对它们进行回顾并寻求新的见解。为了帮助实现这个目的,Linux提供了两个命令:tee和script,前者能将工具的输出保存为文件,后者能记录每一个按键和屏幕上的每一个输出。这些信息可以保存下来,便于之后查看或者创建脚本来自动执行测试。
自动执行命令很重要,因为它可以减少出错的机会,使你在思考问题时不需记住所有的细节。在你一次性键入又长又复杂的命令行之后,bash shell和watch命令都可以让你周期性地自动执行这些命令。在你保证了命令行的正确性后,bash和watch能够周期性地自动执行它们,不需要再次键入。
8.1.2性能统计信息的绘图与分析
除了记录与自动化工具之外,Linux还提供了强大的分析工具帮助你理解性能统计数据的含义。尽管大多数性能工具可以把性能统计数据输出为文本,但是想要发现其中的模式和随时间变化的趋势并不总是件容易的事儿。Linux提供的gnumeric电子表格很强大,它可以对性能数据进行导入、分析和绘图。当你绘制数据图时,性能问题的原因可能会变得明晰,或者至少能揭示调查的新角度。
8.1.3调查应用程序使用的库
还有一些Linux的工具能使你确定应用程序使用了哪些库,以及显示给定库提供的所有函数。ldd命令给出一个特定应用程序使用的全部共享库的列表。在你想要跟踪被应用程序使用的库的数量和位置时,这个命令很有用。Linux中还有一个命令objdump,它可以在指定库或应用程序中搜索并显示其提供的全部函数。ltrace只能给出一个应用程序调用函数的名称,但是结合命令ldd和objdump,你就能够利用ltrace的输出来确定指定函数属于哪个库。
8.1.4创建和调试应用程序
最后,Linux还为你提供了能够创建性能工具友好型应用程序的工具,以及交互式调试和调查运行中应用程序属性的工具。GNU编译器集(gcc)可以在应用程序中插入调试信息,以帮助oprofile找出某个具体性能问题对应的代码行和源文件。此外,GNU调试器(gdb)还可以用来查找被各种性能工具默认不可得的应用程序的运行时信息。
8.2 工具
本节讨论的工具一起使用时,可以极大地提高前面章节介绍的性能工具的有效性和易用性。
8.2.1 bash
bash是默认的Linux命令行shell,在你每次与Linux命令行交互时,最有可能使用它。bash通常有一个功能强大的脚本语言来创建shell脚本。不过这个脚本语言也可以从命令行调用,从而使你在性能调查过程中,能轻松地将一些比较繁琐的任务进行自动化。
8.2.1.1性能相关的选项
bash有一组命令可以一起使用,来周期性地运行特定命令。大多数Linux用户都把bash作为默认的shell,因此,只要登录到一台机器或打开一个终端就会出现bash提示。如果你没有使用bash,也可以键入bash来调用它。
有了bash命令提示符后,你可以输入一系列的bash脚本命令来自动连续地执行特定命令。在使用特定命令周期性提取性能统计数据的情况下,这个功能非常有用。表8-1给出了这些脚本选项。
bash极其灵活,它记录在bash手册中。虽然bash非常复杂,但是在使用它之前并不需要完全掌握它。
8.2.1.2 用法示例
虽然有些性能工具,如vmstat和sar,能周期性地更新性能统计信息,但是其他的命令,比如ps和ifconfig则不能。bash可以调用诸如ps或ifconfig命令来周期性地显示它们的统计数据。例如,在清单8.1中,我们要求bash在条件为true时执行while循环。由于true命令总是为真,因此这个while循环永远都不会结束。接着,在do命令后启动每次迭代之后都要执行的命令,这些命令要求bash休眠1秒钟,然后运行ifconfig来抽取eth0控制器的性能信息。不过,我们只关心接收数据包,因此,我们用grep搜索并显示字符串为“RX packets”的ifconfig输出。最后,执行done命令来告诉bash循环完成。由于true命令总是返回真,所以,该循环将一直执行直到用组合键终止它。
利用清单8.1的bash脚本,可以查看到按秒更新的网络性能统计信息。同样的循环还可以用于监控其他的事件,只要将ifconfig命令修改为其他的命令即可,而通过修改休眠数值也能够改变更新时间间隔。这个简单的循环容易直接在命令行中键入,并且能够自动显示任何你感兴趣的性能统计数据。
8.2.2 tee
tee是一个简单的命令,可以将命令的标准输出保存为文件并同时进行显示。在想要保存并同时查看性能工具输出的时候,tee是很有帮助的。比如,正在监控一个实时系统的性能统计信息的同时,保存这些数据以备将来对它们进行分析。
8.2.2.1性能相关的选项
tee的调用命令行如下:
I tee [-a] [file]