linux性能检测之top命令详解
一、top命令简介
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止. 比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定.
二、 参数含义
2.1 命令格式:
top -hv | -bcHiOSs -d secs -n max -u | U user -p pid -o fld -w [cols] #默认直接top命令就可以了。后面这些都是可选的。
2.2 命令行选项
-h|-v : 帮助/版本
-b :批处理模式操作
-c : 命令行/程序名切换
-d : 延迟时间间隔为:-d 秒数。小数秒钟将被允许,但不允许使用负数。然而,在所有情况下,如果top在安全模式下运行,则禁止这样的更改,除了root。
-H : 线程模式操作。指示顶部显示单个线程。如果没有此命令行选项,将显示每个进程中所有线程的总和。
-i : 空闲进程切换。从最后一个记住的“i”状态反转开始。当此切换为关闭时,自上次更新后未使用任何CPU的任务将不会显示。
-n: 迭代次数限制为:-n number。指定结束前top应该产生的最大迭代次数或帧数。
-o: 覆盖 - 排序字段为:-o字段名。指定任务将被排序的字段的名称,与配置文件中反映的内容无关。您可以在字段名称前面加上“+”或“ - ”,以覆盖排序方向。领先的“+”将强制排序高 低,而“ - ”将确保从低到高的顺序。
此选项主要用于支持自动/脚本化批处理模式操作。
-O: 输出字段名。 此选项作为上述-o选项的帮助形式。它将使顶部打印每个可用的字段名称在一个单独的行,然后退出。
-p: Monitor-PIDs模式为:-pN1 -pN2 ...或-pN1,N2,N3 ...仅监视具有指定进程ID的进程。此选项最多可以给出20次,或者您可以提供最多20个字符的逗号分隔列表。允许合并两种方法。
pid值为零将被视为顶层程序本身的进程id,一旦它运行。 这只是一个命令行选项,如果你希望返回正常操作,没有必要退出和重新启动top - 只发出任何这些交互式命令:`=',`u'或`U'。
`p',`u'和`U'命令行选项是互斥的。
-s:安全模式操作。以安全模式强制启动,甚至为root。此模式通过系统配置文件控制得更好。
-S:累计时间切换从最后一个记住的“S”状态反转开始。当累积时间模式为打开时,每个进程都列出了它和它的死掉的子进程使用的cpu时间。
-u | -U: 仅显示具有与给定用户ID匹配的用户ID或用户名的进程。 `-u'选项匹配有效用户,`-U'选项匹配任何用户(真实,有效,已保存或文件系统)。
将感叹号(“!”)预先添加到用户标识或名称前,指示top仅显示用户与提供的不匹配的进程。p',`u'和`U'命令行选项是互斥的。
-w: 输出宽度覆盖为:-w [number]在批处理模式下,如果没有参数顶部,则使用COLUMNS =和LINES =环境变量(如果设置)格式化输出。否则,宽度将固定为最多512列。有了一个争论,
输出宽度可以减小或增加(最多512个),但行数被认为是无限的。在正常显示模式下,如果不使用参数顶部,将使用COLUMNS =和LINES =环境变量(如果设置)尝试格式化输出。使用参数,输出宽度只能减小,而不能
增加。无论使用环境变量,ables或带-w的参数,当不处于批处理模式时,不能超过实际端子尺寸。注意:如果不使用此命令行选项,则输出宽度始终基于调用top的终端,无论是否处于批处理模式。
博文来自:www.51niux.com
2.3 显示内容介绍
#top
第一列:top - 17:34:57 up 588 days, 2:02, 1 user, load average: 0.35, 0.45, 0.41
17:34:57为当前时间 up 588 dayss, 2:02,系统运行时间,可见运行了588天2小时2分钟 1 user当前登录的用户数,可见是1个用户 load average: 0.35, 0.45, 0.41三个值分别是1分钟、5分钟、15分钟前到现在的平均值。也就是系统负载,即任务队列的平均长度。
第二列:Tasks: 778 total, 1 running, 777 sleeping, 0 stopped, 0 zombie
Tasks: 778 total为进程总数 1 running是正在运行的进程数 777 sleeping是睡眠的进程数 0 stopped是停止的进程数 0 zombie是僵尸进程数
第三列:Cpu(s): 0.2%us, 0.1%sy, 0.0%ni, 99.6%id, 0.1%wa, 0.0%hi, 0.0%si, 0.0%st
0.2%us 用户空间占用CPU百分比 0.1%sy内核空间占用CPU百分比 0.0%ni用户进程空间内改变过优先级的进程占用CPU百分比 99.6%id空闲CPU百分比 0.1%wa是等待输入输出的CPU时间百分比
0.0%hi 硬中断(Hardware IRQ)占用CPU百分比 0.0%si 软中断(Software Interrupts)占用CPU百分比 0.0%st(Steal time) 是当 hypervisor 服务另一个虚拟处理器的时候,虚拟 CPU 等待实际 CPU 的时间的百分比。Steal 值比较高的话,扩容虚拟机或者虚拟机所在的宿主机有问题,或者分配的资源有些超了。
第四列:Mem: 32827424k total, 29301812k used, 3525612k free, 2421276k buffers
32827424k total 是物理内存总量,这里大概是31G多 29301812k used是使用的物理内存总量这里大概是27G 3525612k free为空闲内存总量这里为3G多 2421276k buffers用作内核缓存的内存量这里为2G
第五列:Swap: 4194296k total, 784232k used, 3410064k free, 20459520k cached
4194296k total swap交换区总量这里为4G 784232k used使用的交换区总量 3410064k free空闲交换区总量 20459520k cached缓冲的交换区总量。内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小。相应的内存再次被换出时可不必再对交换区写入。
2.4 top显示内容的字段描述,显示各进程的详细信息。下面是各列的含义。
PID:进程id。任务的唯一进程ID,它会定期回绕,但从不重新启动为零。在内核术语中,它是由task_struct定义的可分派实体。
PPID:父进程id。任务父进程的进程ID(pid)。
USER:进程所有者
RUSER:实际用户名,真正的用户名。
UID: 进程所有者的用户id
GROUP:进程所有者的组名
GID:组ID。有效组ID。
SUID: 保存的用户ID。
SUPGIDS:补充组ID,在登录时建立或从任务父级继承的任何补充组的ID。它们以逗号分隔列表显示。
SUPGRPS :补充组名称.在登录时建立或从任务父级继承的任何补充组的名称。它们以逗号分隔列表显示。
SUSER : 已保存的用户名.
TGID:线程组ID.任务所属的线程组的ID。它是线程组组长的PID。在内核术语中,它表示共享一个mm_struct的那些任务。
SID: 会话标识,会话是通常由登录shell建立的进程组的集合。一个新的分支进程加入其创建者的会话。按照惯例,该值等于进程ID的会话的第一成员,称为会话领导,通常是登录shell。
PGRP:进程组标识。每个进程是唯一进程组的成员,其用于信号的分发,并且由终端仲裁对其输入和输出的请求。当一个进程被创建(分叉)时,它变成一个
其父进程组的成员。按照惯例,此值等于进程组的第一个成员的进程ID,称为进程组组长。
CGROUPS:控制组,进程所属的控制组的名称,如果不适用于该进程,则为“ - ”。控制组提供在安装定义的进程组之间分配资源(CPU,内存,网络带宽等)。它们支持对分配,拒绝,优先级排序,
管理和监测这些资源。 cgroup的许多不同层次结构可以在系统上同时存在,并且每个层次结构连接到一个或多个子系统。子系统表示单个资源。注意:与大多数列不同,CGROUPS字段不是固定宽度。显示时,其加上任何其他可变宽度列将分配所有剩余的屏幕宽度(最多512个字符)。前夕这样,这样的可变宽度字段可以仍然遭受截断。
ENVIRON:环境变量。显示所有环境变量(如果有的话),如各个进程所看到的。这些变量将以原始原始顺序显示,而不是习惯使用un查看的排序顺序合格的“集”。
Flags:任务标志。此列表示任务的当前调度标志,以十六进制符号表示并且抑制零。这些标志在<linux / sched.h>中正式记录。
TTY:启动进程的终端名。不是从终端启动的进程则显示为?
TPGID:Tty过程组标识。连接的tty的前台进程的进程组ID,如果进程未连接到终端,则为-1。按照惯例,该值等于进程组组长的进程ID。
PR:进程优先级
NI:nice值。负值表示高优先级,正值表示低优先级
P:最后使用的CPU,仅在多CPU环境下有意义。
VIRT: 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES
RES :进程使用的、未被换出的物理内存大小,驻留内存大小(KiB)任务正在使用的未交换物理内存。RES=CODE+DATA
CODE: 可执行代码占用的物理内存大小,单位kb。也称为文本驻留集大小或TRS。
DATA: 用于其他可执行代码的物理内存量,也称为数据驻留集大小或DRS。,单位kb
SHR:任务可用的共享内存量,并非所有内存通常驻留。它只是反映可能与其他进程共享的内存,单位kb
nFLT:页面错误次数。
vMj:主页故障计数增量,自上次更新以来发生的主要页面故障数
vMn:次要页面故障计数增量,自上次更新以来发生的次要页面故障数
nDRT:脏页计数,自上次写入辅助存储器以来已修改的页面数。在可以使用对应的物理内存位置之前,脏页必须写入辅助存储器。
nMaj: 主页故障计数,任务发生的主要页面故障数。当进程尝试读取或写入当前不存在于其地址空间中的虚拟页面时,发生页面错误。一个主要的页面故障是辅助存储访问时涉及使该页面可用。
nMin:次要页故障计数 任务发生的次要页面故障数。当进程尝试读取或写入当前不存在于其地址空间中的虚拟页面时,发生页面错误。
nHT:线程数,与进程相关联的线程数。
nsIPC: IPC命名空间命名空间的Inode用于隔离进程间通信(IPC)资源,例如System V IPC对象和POSIX消息队列。
nsMNT:MNT命名空间用于隔离文件系统挂载点的命名空间的Inode,因此提供了文件系统层次结构的不同视图。
nsNET:NET命名空间用于隔离资源(如网络设备,IP地址,IP路由,端口号等)的命名空间的Inode.
nsPID:PID命名空间,用于隔离进程ID号的命名空间的Inode,意味着它们不需要保持唯一。因此,每个这样的命名空间可以具有它自己的“init”(PID#1)来管理各种初始化任务和收获孤儿子进程。
nsUSER: USER命名空间,用于隔离用户和组ID号的命名空间的Inode。因此,进程可以在用户名空间外具有正常的非特权用户ID,而用户ID为0,具有完全根特权es,在这个命名空间。
nsUTS:UTS命名空间,用于隔离主机名和NIS域名的命名空间的Inode。 UTS只是指“UNIX分时系统”。
S:进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 t=在跟踪期间被调试器停止 Z=僵尸进程
%CPU:上次更新到现在的CPU时间占用百分比。在真正的SMP环境中,如果进程是多线程的,并且top不在线程模式下运行,则可以报告大于100%的量。使用`H'交互式命令切换线程模式。
此外,对于多处理器环境,如果Irix模式为Off,top将以Solaris模式运行,其中任务的CPU使用率将除以总CPU数。您可以使用“I”切换Irix / Solaris模式teractive命令。
%MEM :进程使用的物理内存百分比。 内存使用(RES)。
USER:使用的内存(KiB),此字段表示任务已使用的非交换物理内存(RES)加上其地址空间(SWAP)的非常驻部分。
SWAP : 交换容量(KiB)任务地址空间的非常驻部分。
VIRT :虚拟内存大小(KiB),任务使用的虚拟内存总量。它包括所有代码,数据和共享库,已交换的页面和已映射但未使用的页面。
WCHAN:若该进程在睡眠,则显示睡眠中的系统函数名
TIME:CPU时间.任务自启动以来使用的总CPU时间。当累积模式为打开时,每个进程都列出它和它的已死进程使用的cpu时间。您使用“S”切换累积模式,即命令行选项和interac-tive命令。
TIME+ :进程使用的CPU时间总计, 与TIME相同,但是通过百分之一秒反映更多的粒度。
COMMAND: 显示用于启动任务的命令行或相关程序的名称。您可以使用`c'在命令行和名称之间切换,它既是命令行选项,也是交互式命令。您可以使用`c'在命令行和名称之间切换,它既是命令行选项,也是交互式命令。
2.5 与top进行交互
f/F: 上面说了那么多的显示,我靠怎么显示呢?命令行输入top,进入top显示界面。然后按f或者F,就会进入到一个页面。这个页面呢默认的就是显示的哪几项,前面带有*。如果你想继续显示多余的字段,就按上下左右键移动到要显示的行,然后按一下空格或者d,前面会出现*,就是选中了,再按下*就是取消选中了,选择完毕之后按q退出,就退到了top显示页面,你会发现我靠多了很多的显示项,这时候一个屏幕可能显示不全,你再按左右键可以左右移动显示内容。当然当你退出top,再次进入的top的时候,还只是默认的哪几个选项。如果要永久保存呢,就按W。就把配置写入到了/root/.toprc文件。
h/?:可以显示一些命令的帮助信息
博文来自:www.51niux.com
三、top命令界面的输入
3.1 全局命令:
0:零抑制切换,此命令确定是否对任务窗口中的许多字段显示或抑制零。像UID,GID,NI,PR或P等字段不受此切换影响。
A:交替显示模式切换,此命令将在全屏模式和交替显示模式之间切换。
B:粗体 - 禁用/启用切换
E:总结区域中的扩展内存规模使用此命令,您可以循环使用可用的汇总区域内存缩放,范围从KiB(kibibytes或1,024字节)到EiB(exbibytes或1,152,921,504,606,846,976字节)。如果在显示的数字和以下标签之间看到一个“+”,则意味着顶部被迫截断该数字的某些部分。通过提高缩放因子,可以避免这种截断。
e:任务窗口中的扩展内存缩放使用此命令,您可以循环通过可用的任务窗口内存缩放,范围从KiB(千字节或1,024字节)到PiB(pebibytes或1,125,899,906,842,624字节)。 尽管top将尝试遵守所选择的目标范围,但是仍然需要附加的缩放以便容纳当前值。如果您希望在内存列中看到更均匀的结果,通常会提高缩放范围实现这一目标。然而,提高它太高,很可能产生一个全零的结果,不能用`0'交互式命令抑制。
g:选择另一窗口/字段组,系统将提示您输入一个介于1和4之间的数字,指定应该作为'current'窗口的字段组。你会很快地变得舒适与这4个窗口,特别是在实验后交替显示模式。
H:线程模式切换,当此切换为开启时,将在所有可见任务窗口中的所有进程显示单独的线程。否则,top显示每个进程中所有线程的总和。
I:Irix / Solaris模式切换,当在Solaris模式下操作(“I”切换为关闭)时,任务的CPU使用率将除以CPU的总数。发出此命令后,您将被告知此切换的新状态。
k:按了k之后,让你输入要杀死进程的PID号,输入进程的PID号之后按回车,然后杀死进程的信号就会发出去,进程就被杀死了。
W:写配置文件,这将保存所有的选项和切换加上当前的显示模式和延迟时间。通过在退出top之前发出此命令,您将能够稍后在完全相同的状态下重新启动。
X:额外固定宽度,一些字段是固定宽度,不可缩放。因此,它们经受截断,其将在最后位置中由“+”表示。 注意:无论是显式增加还是自动增加,这些字段的宽度不会由顶部减小。要缩小它们,您必须指定较小的数字或恢复默认值。
Z:更改颜色映射,此键会将您带到一个单独的屏幕,您可以在其中更改“当前”窗口或所有窗口的颜色。按数字是选择颜色,选择完颜色按Enter退出,然后按z就可以自由切换显示颜色了。
q:退出
3.2 区域命令
概要区域命令,汇总区交互式命令始终可用于全屏模式和交替显示模式。它们影响显示的开始行,并确定消息的位置和提示。这些命令总是影响“当前”窗口/字段组。
C:显示滚动坐标切换,切换信息性消息,每当消息行没有被使用时显示。滚动窗口。
l:负载平均/正常运行时切换,这也是在全屏模式下运行时包含程序名(可能是别名)或在交替显示模式下运行时包含“当前”窗口名的行。
t:任务/ Cpu-States切换,此命令影响从2到许多汇总区域行,根据`1',`2'或`3'命令的状态切换和top是否在真正的SMP下运行。汇总区域的这一部分也受到“H”交互式命令切换的影响,如显示任务或线程的总标签所反映。此命令用作4路切换,循环切换这些模式:详细百分比(默认)再按t.缩写用户/系统和总%+条形图。再按t.缩写用户/系统和总%+块图。再按t.关闭任务和CPU状态显示
m:内存/交换 - 使用切换,此命令影响处理物理和虚拟内存的两个汇总区域线。
此命令用作4路切换,循环切换这些模式:按存储器类型的详细百分比(默认),按t.缩写%used /总可用+条形图。再按t.缩写%used / total available + block graph。再按t.关闭内存显示
1:单/单独 - 状态切换,此命令影响`t'命令的Cpu状态部分的显示方式。虽然这种切换主要存在于服务大规模并行的SMP机器,但并不仅限于SMP环境 - ments。当在摘要区域中看到“%Cpu(s):”时,“1”开关打开,所有cpu信息在一行中收集。否则,每个cpu分别显示为:`%Cpu0,%Cpu1,...'可用屏幕高度。
2:NUMA-Nodes / Cpu-Summary切换,此命令在`1'命令cpu摘要显示(仅)或汇总显示加上每个NUMA节点的cpu使用统计信息之间切换。它仅在系统具有必需的NUMA时可用支持。
3:Expand-NUMA-Node将被邀请输入一个代表NUMA节点的数字。此后,将显示节点摘要加上该节点中每个cpu的统计信息,直到“1”或“2”命令切换为按下。仅当系统具有必需的NUMA支持时,此交互式命令才可用。
3.3 任务区命令
外观任务窗口:
J:对齐 - 数字列切换,右对齐(默认)和左对齐的数值数据之间的交替。如果数字数据完全填充可用列,则此命令切换可能仅影响列标题。
j:对齐 - 字符 - 列切换,左对齐(默认)和右对齐字符数据之间的交替。如果字符数据完全填充可用列,则此命令切换可能仅影响列标题。
以下命令也将受全局“B”(粗体启用)切换的状态的影响。
b:加粗/反向切换,此命令将影响`x'和`y'切换的显示方式。当通过“t”或“m”切换为cpu状态或内存使用选择条形图时,它也可能影响汇总区域。
x:列高亮切换,更改当前排序字段的突出显示。如果您忘记了正在排序的字段,则此命令可以用作快速视觉提醒,只要正在显示排序字段。排序字段可能不可见,因为:1)屏幕宽度不足2)`f'交互命令将其关闭
y:行高亮切换,更改“正在运行”任务的突出显示。
z:彩色/单色切换,在最后使用的颜色方案和较旧形式的黑白或黑白之间切换“当前”窗口。 此命令将更改摘要区域和任务区域,但不会更改 影响“x”,“y”或“b”切换的状态。
内容任务窗口:
c:命令行/程序名切换,无论COMMAND列当前是否可见,此命令都将被执行。后来,如果这个领域被看到,你应用的变化将被看到。会看到COMMAND的全部内容。
o | O:其他过滤,将提示您选择标准,然后确定哪些任务将显示在“当前”窗口中。您的标准可以区分大小写,也可以忽略大小写。确定top是否应包含或排除匹配任务。
S:累积时间模式切换,当累积模式为打开时,每个进程都列出它和它的已死子进程使用的cpu时间。
u | U:仅显示特定用户, 将提示您输入要显示的用户的uid或名称。 -u选项匹配有效用户,而-U选项匹配任何用户(真实,有效,已保存或文件系统)。此后,在该任务窗口中将仅示出匹配的用户,或者可能不示出任何处理。将感叹号(“!”)添加到用户标识或名称前,指示顶部仅显示进程与用户不匹配提供的。不同的任务窗口可用于过滤不同的用户。稍后,如果您希望在'current'窗口中再次监视所有用户,请重新发出此命令,但只需在提示符下<Enter>。
V:森林视图模式切换,在此模式下,根据其父进程重新排序进程,并且COMMAND列的布局类似于树的布局。在林视图模式下,仍然可以在程序名称之间切换和命令行或进程和线程之间切换。
任务窗口的大小:
i:空闲过程切换, 显示所有任务或仅活动任务。当此切换为关闭时,自上次更新后未使用任何CPU的任务将不会显示。但是,由于%CPU和TIME +的粒度字段,仍然可能显示似乎没有使用CPU的某些进程。
n | #:简单说就是按#或者n,然后输入数字,数字如果是10,就显示10条数据
博文来自:www.51niux.com
四、top 选项操作
# top -c #显示完成的命令
# top -b #以批处理模式操作,
开启top工作在批处理模式,这样在需要将top的输出信息输出 到其他程序或文件时非常有用。在这种模式下,top不接受任何输入操作,直到通过-n 设置的重复次数后,或者退出top才终止。
在终端中输入top -b top将不断重复地显示任务信息,知道按Ctrl+C终止为止,在终端中输入top -b -n 10 ,top将显示10次后终止,也就是分10个批次显示完后就退出。
# top -d 2 #设定屏幕2秒刷新一次
# top -i #-i 空闲进程开关,以系统记得的“i”状态的相反状态启动top。当开关是off时,空闲的或僵死的任务将不被显示。
# top -n 2 #设置重复次数,这里就是刷新2次就退出top。
# top -u qemu #以qemu的用户显示top,当然也可以用uid,这里就是只显示此用户的top信息。
# top -p 2042,2066 #只pid为2042和2066的top信息。按=可以切换到显示所有的状态。
#top -s #以安全模式操作
#top - S #累计时间模式切换开关
# top -b -n 1 >/tmp/2 #top以文本的形式被写入到一个文件里面,如果你不加-b,也可以追加到文件中,用cat命令是显示正常的,但是用vim打开就疯了,类似于二进制的乱码。
#进入top命令界面后,按1,可以显示所有的cpu的信息。再按1就切换回来了。
#进入top界面后,默认是按CPU百分比排序的,按shift+m可以按内存进行排序,shift+p或者P按%CPU使用率排序。
#进入top界面后,按y打开运行进程的高亮显示效果,再按x可以对cpu进行高亮显示。
#进入top界面后,如果你想自己选择按哪一列排序,可以通过shift+>或者shift+<来向右或向左改变排序列,不过你前提要按y打开竖列的高亮,不然你自己都会移动懵逼。
#进入top界面后,按T,按MITE+排序
#进入top界面后,按i只显示允许的进程
#top -H:显示进程的所有线程,下图是没有top -H和top -H的对比。