top
top命令是最流行的性能工具之一。大多数系统管理员运行top查看Linux和UNIX系统的运行情况。top实用工具提供一种监视进程和Linux整体性能的理想方法。将Linux进程称作任务更准确,但是在本章中我们还是将它们称作进程,因为这个工具也这样称呼它们。1普通用户和root用户都可以运行top。图3-1显示一个空闲系统的典型top输出。
图3-1 top输出
top显示有两个部分。大约前三分之一显示关于Linux的整体信息,其余行为各个进程信息。如果扩展窗口则显示更多进程而填充整个屏幕。
更全面的Linux信息可以通过使用top之外的几个命令来得到。不过,通过一个命令在一个屏幕上显示所有信息比较理想。第一行显示最近1分钟、5分钟和15分钟的负载平均值。负载平均值表示在CPU上运行或者等待运行多少进程。uptime命令也可以用来显示负载平均值。接下来是进程信息,之后是CPU、内存和交换区。内存和交换区信息与free命令输出类似。在我们确定内存和CPU使用之后的下一个问题是哪些进程正在使用它。
大部分进程信息也可以通过ps命令得到,但是top提供一种更易于阅读的格式。最有用的是用于提供帮助的h,它列出top的其他交互式命令。
1 添加和移除字段
字段可以从显示中添加或移除。进程输出可以按照CPU、内存或者其他指标排序。这是一个查看什么进程抢夺内存的理想方法。各个Linux发布版本的top语法和交互式选项不同,帮助命令可以快速列出什么命令可用。有许多交互式选项可用,用户应该花费一些时间来试验它们。
图3-2显示Red Hat Enterprise Linux ES release 3的帮助屏幕。
图3-2 top的帮助屏幕
f命令用来从top输出中添加或者移除字段。图3-3是一个Red Hat Enterprise Linux ES release 3的帮助屏幕,显示什么字段可以添加。
图3-3 top添加/移除字段的屏幕
图3-4显示一个SUSE Linux 9.0 top的帮助屏幕,可见它们提供的命令差别非常大。
图3-4 SUSE top的帮助屏幕
2 解释输出
让我们研究top信息的意义,以top的如下输出为例:
top输出的第一行显示负载平均值信息:
这个输出与uptime的输出类似。从中可看到Linux已经运行时间、当前时间和用户数量,以及1分钟、5分钟和15分钟负载平均值。接下来显示进程概要:
我们看到总共有73个进程,其中72个进程正在休眠,一个进程正在运行,没有僵化进程或者被停止的进程。当一个进程退出并且它的父进程没有通过wait(2)或者waitpid(2)函数等待它时,它就会成为僵化进程。这通常是由于父进程在它的子进程之前退出造成的。不同于进程表中的项,僵化进程不使用资源。停止的进程是已经向它发送STOP信号的进程。更多信息,请参见signal(7)手册页。
接下来是CPU信息:
CPU行描述CPU如何使用它们的CPU周期。top命令报告CPU在用户或者内核模式、运行良好进程以及处在空闲状态时所花费时间的百分比。iowait列显示没有进程在CPU上运行时,处理器等待I/O完成的时间的百分比。irq和softirq列表示处理硬件和软件中断所花费的时间。早于2.6版本的Linux内核不报告irq、softirq和iowait。
接下来是内存信息:
前三个指标提供内存使用的概要,列出了总的可用内存、已使用内存和自由内存,它们都是确定对于Linux内存是否足够所需信息。
接下来五个指标标识已使用的内存如何分配。shrd字段显示共享的内存使用,buff是缓冲使用的内存。分配给内核或者用户进程的内存可以处在三种不同状态:活动(active)、不活动脏(inactive dirty)和不活动干净(inactive clean)。活动在top中用aotv表示,表示该内存最近被使用。不活动脏在top中用in_d表示,表示该内存最近没有使用,可以回收。要回收内存,必须将它的内容写到磁盘,这个进程命名为“清洗”,也可称作内存的第四种临时状态。一旦被清洗,不活动脏内存成为不活动干净内存,在top中用in_c表示。由Norm Murray和Neil Horman合著的Understanding Virtual Memory in Red Hat Enterprise Linux 3是一本优秀的参考书,网址为http:people.redhat.com/nhorman/papers/ rhel3_vm.pdf。
接下来是交换区信息:
av字段是可用的交换区总量,之后是已用数量和自由数量,最后是内核用于缓存的内存数量。
top显示的其余部分是进程信息:
top显示尽可能多的能适合屏幕的进程。top(1)手册页中提供了字段说明的描述。表3-1提供了这些字段的概要。
表3-1 top进程字段
字 段 |
说 明 |
PID |
进程id编号 |
USER |
进程所有者的用户名 |
PRI |
进程的优先级 |
SIZE |
进程大小,包括它的代码、栈和数据区域,以千字节为单位 |
RSS |
进程使用的内存总量,以千字节为单位 |
SHARE |
进程使用的共享内存数量 |
STAT |
进程的状态,通常R表示运行,S表示休眠 |
%CPU |
自从最近的屏幕更新以来,这个进程使用的CPU百分比 |
%MEM |
这个进程使用的内存百分比 |
TIME |
自从进程启动以来,这个进程使用的CPU时间量 |
CPU |
最近执行进程的CPU |
COMMAND |
正在执行的命令 |
3 保存自定义
一个非常好的top功能是保存当前配置。可以使用交互式命令s任意更改显示,然后按w保存该视图。
top在用户的主目录中写入一个.toprc文件,用来保存配置,以便下一次这个用户启动top时使用相同的显示选项。
top也寻找默认配置文件/etc/toprc。这是一个全局配置文件,当任何用户运行实用工具时,top将读取该文件。这个文件可以使top以安全模式运行,也可以设置刷新延迟。安全模式阻止非root用户注销或者更改进程的正常值,也阻止非root用户更改top的刷新值。Red Hat Enterprise Linux ES release 3的一个/etc/toprc示例文件如下所示:
s表示安全模式,3定义三秒钟刷新间隔。其他发布版本可能有不同的/etc/toprc格式。注销进程是一个非常实用的功能。如果用户有一个失控的进程,通过top命令可以轻易找到并注销它,具体步骤为:运行top,通过u命令显示用户的所有进程,然后使用k注销它。top不只是一个优秀的性能监视工具,它也可以用来通过注销那些产生问题的进程从而改进性能。
4 批处理模式
top也可以以批处理模式运行。尝试运行以下命令:
-n 1告诉top只显示一次迭代,-b选项表示以适合写入文件的文本形式输出或者定向到另一个程序(例如less)。类似以下两行脚本的命令可以顺利完成cron工作:
可以将它添加到crontab,并每隔15分钟收集一次输出。
通过批处理可以轻松完成所有任务,无需用户的干涉。所有进程都被列出,输出并不是每5秒钟刷新一次。如果用户的主目录中存在一个.toprc配置文件,那么它用来格式化显示。以下是在一个多CPU Linux服务器上运行top批处理模式的输出。注意,其中没有显示top输出的所有258个进程。
现在读者可能明白了为什么top会如此流行。top的交互式本质和容易自定义输出的能力使它成为诊断问题的优秀工具。
vmstat命令也是显示Linux性能指标的方法,它报告了许多信息,理解这些信息有一定难度。
输出分为6个类别:进程、内存、交换区、I/O、系统和CPU。与iostat类似,第一个样本是从最近重新启动以来的平均值。以下是一个典型的vmstat输出:
-m选项使内存字段以兆字节为单位显示。vmstat和许多其他性能命令一样使用取样间隔和计数参数。
进程(procs)信息有两列。r列是可运行进程的数量,b列是阻塞进程的数量。
内存部分有4个报告虚拟内存如何使用的字段。表3-7列出这些字段及其意义。
表3-7 vmstat内存字段
字 段 |
说 明 |
Swap |
已用的交换空间数量 |
free |
自由RAM数量 |
buff |
缓冲使用的RAM数量 |
cache |
文件系统缓存使用的RAM数量 |
接下来是交换(swap)指标。交换只是一个古老术语,但是显然不会消失。交换涉及分页读取或写入磁盘的进程所消耗的所有内存。它将显示系统达到的性能指标水平。而Linux所做的是,以小块方式按照需要对磁盘空间进行分页操作。因此,我们可能应该停止说交换到磁盘的内存,并开始说分页到磁盘的内存。对于任何一种方法,表3-8解释了相关字段。
表3-8 vmstat交换字段
字 段 |
说 明 |
si |
从磁盘分页到内存的数量 |
so |
从内存分页到磁盘的数量 |
在交换之后是两个I/O字段。这部分提供了一个简略介绍以帮助确定Linux是否正忙于完成许多磁盘I/O。vmstat只提供两个字段,显示出入磁盘的数据量(参见表3-9)。
表3-9 vmstat io字段
字 段 |
说 明 |
bi |
从磁盘读入的块 |
bo |
写入磁盘的块 |
系统字段提供Linux内核进行进程管理的繁忙程度的摘要。中断和上下文开关参见表3-10。上下文开关指进程移出CPU或者移入CPU。
表3-10 vmstat系统字段
字 段 |
说 明 |
in |
系统中断 |
cs |
进程上下文开关 |
最后,CPU状态信息用总CPU时间的百分比来表示,如表3-11所示。
表3-11 vmstat cpu字段
字 段 |
说 明 |
us |
用户模式 |
sy |
内核模式 |
wa |
等待I/O |
id |
空闲 |
iostat
iostat命令是另一个研究磁盘吞吐量的工具。和sar类似,iostat可以使用间隔和计数参数。第一个间隔的输出包含Linux总运行时间的指标。与其他性能命令比较,这可能是iostat最独特的功能。例如,以下是一个大部分时间处于空闲的系统的输出。可见,从启动以来hda设备已经读取大约9 158MB(18 755 572*512/1 024/1 024)。Blk列是512字节块。
不使用选项,iostat只显示覆盖启动以来全部时间的一组指标。
CPU信息包含基本上和top一样的字段。iostat CPU输出显示在用户模式中执行、执行正常进程、在内核(系统)模式中执行,进程等待I/O完成时处于空闲和没有等待进程时处于空闲的CPU时间的百分比。CPU行是所有CPU的摘要。
磁盘信息与sar -d提供的信息类似。输出包括每秒传输数(tps)、每秒512字节块读取数(Blk_read/s)、每秒512字节块写入数(Blk_wrtn/s)和512字节块读取(Blk_read)和写入(Blk_wrtn)的总数量。
iostat提供几个用于定制输出的开关。最有用的有:
-c 只显示CPU行
-d 显示磁盘行
-k 以千字节为单位显示磁盘输出
-t 在输出中包括时间戳
-x 在输出中包括扩展的磁盘指标
1 CPU统计数据
iostat -c输出显示CPU信息,该输出以百分比显示CPU的使用情况。表3-2解释该输出。
表3-2 iostat -c字段
字 段 |
说 明 |
CPU |
CPU编号 |
%user |
在用户模式中运行进程所花的时间 |
%nice |
运行正常进程所花的时间 |
%system |
在内核模式(系统)中运行进程所花的时间 |
%iowait |
没有进程在该CPU上执行时,处理器等待I/O完成的时间 |
%idle |
没有进程在该CPU上执行的时间 |
这些看起来应该比较熟悉,它和top报告中的CPU信息内容相同。以下显示输出格式:
其中的5 10导致iostat以5秒钟间隔取得10个样本。任何iostat报告的第一列都是时间戳。
2 磁盘I/O统计数据
第一行-d显示磁盘I/O信息,5 2选项是间隔和迭代,就像iostat数据收集器那样。表3-3列出了字段和说明。
表3-3 iostat -d字段
字 段 |
说 明 |
DEV |
磁盘设备 |
tps |
每秒传输数(或者每秒IO数) |
Vmstat
top命令是一个优秀的交互式实用工具,用于监视性能。它提供关于整体Linux性能的几个概要行,但是报告进程信息才是top真正的长处。可以广泛自定义进程显示,也可以添加字段,按照不同指标排序进程列表,甚至从top注销进程。
sar实用工具提供监视每一事件的能力。它至少有15个单独的报告类别,包括CPU、磁盘、网络、进程、交换区等等。
vmstat命令报告关于内存和交换区使用的广泛信息。它也报告CPU和一些I/O信息。iostat报告存储输入/输出(I/O)统计资料。