Linux命令之top命令介绍
Linux命令之top命令介绍
top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。下面详细介绍它的使用方法。
top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定
1.命令格式:
top [参数]
2.命令功能:
显示当前系统正在执行的进程的相关信息,包括进程ID、内存占用率、CPU占用率等
3.命令参数:
-b 批处理
-c 显示完整的触发命令(即commont字段内容的切换,貌似显示为请求类型与完整的该进程的触发命令行内容之间切换) 显示整个命令行而不只是显示命令名,这里指的是command字段的列信息,将显示完整的开启该进程的命令行的信息。 开启前:mysqld,开启后:/usr/libexec/mysqld --basedir=/usr --datadir=/newdata/mysqldata --user=mysql --log
-I 忽略失效过程
-s 保密模式。
-S 累积模式。
-i<时间> 设置间隔时间。
-u<用户名> 指定用户名。
-p<进程号> 指定进程。
-n<次数> 循环显示的次数。
4.使用实例:
实例1:显示进程信息
[[email protected] log]# top
top - 14:06:23 up 70 days, 16:44, 2 users, load average: 1.25, 1.32, 1.35
Tasks: 206 total, 1 running, 205 sleeping, 0 stopped, 0 zombie
Cpu(s): 5.9%us, 3.4%sy, 0.0%ni, 90.4%id, 0.0%wa, 0.0%hi, 0.2%si, 0.0%st
Mem: 32949016k total, 14411180k used, 18537836k free, 169884k buffers
Swap: 32764556k total, 0k used, 32764556k free, 3612636k cached
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
28894 root 22 0 1501m 405m 10m S 52.2 1.3 2534:16 java
18249 root 18 0 3201m 1.9g 11m S 35.9 6.0 569:39.41 java
2808 root 25 0 3333m 1.0g 11m S 24.3 3.1 526:51.85 java
25668 root 23 0 3180m 704m 11m S 14.0 2.2 360:44.53 java
574 root 25 0 3168m 611m 10m S 12.6 1.9 556:59.63 java
1599 root 20 0 3237m 1.9g 11m S 12.3 6.2 262:01.14 java
1008 root 21 0 3147m 842m 10m S 0.3 2.6 4:31.08 java
13823 root 23 0 3031m 2.1g 10m S 0.3 6.8 176:57.34 java
28218 root 15 0 12760 1168 808 R 0.3 0.0 0:01.43 top
29062 root 20 0 1241m 227m 10m S 0.3 0.7 2:07.32 java
1 root 15 0 10368 684 572 S 0.0 0.0 1:30.85 init
2 root RT -5 0 0 0 S 0.0 0.0 0:01.01 migration/0
3 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/0
4 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/0
5 root RT -5 0 0 0 S 0.0 0.0 0:00.80 migration/1
6 root 34 19 0 0 0 S 0.0 0.0 0:00.00 ksoftirqd/1
7 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/1
8 root RT -5 0 0 0 S 0.0 0.0 0:20.59 migration/2
9 root 34 19 0 0 0 S 0.0 0.0 0:00.09 ksoftirqd/2
10 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/2
11 root RT -5 0 0 0 S 0.0 0.0 0:23.66 migration/3
12 root 34 19 0 0 0 S 0.0 0.0 0:00.03 ksoftirqd/3
13 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/3
14 root RT -5 0 0 0 S 0.0 0.0 0:20.29 migration/4
15 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/4
16 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/4
17 root RT -5 0 0 0 S 0.0 0.0 0:23.07 migration/5
18 root 34 19 0 0 0 S 0.0 0.0 0:00.07 ksoftirqd/5
19 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/5
20 root RT -5 0 0 0 S 0.0 0.0 0:17.16 migration/6
21 root 34 19 0 0 0 S 0.0 0.0 0:00.05 ksoftirqd/6
22 root RT -5 0 0 0 S 0.0 0.0 0:00.00 watchdog/6
23 root RT -5 0 0 0 S 0.0 0.0 0:58.28 migration/7
统计信息区:前五行是当前系统情况整体的统计信息区。下面我们看每一行信息的具体意义。
第一行,任务队列信息,该行同linux命令行uptime 命令的执行结果,详细参见本手册的uptime命令,具体参数说明情况如下:
14:06:23 — 当前系统时间
up 70 days, 16:44 — 系统已经运行了70天16小时44分钟(在这期间系统没有重启过的吆!)
2 users — 当前有2个用户登录系统
load average: 1.15, 1.42, 1.44 — load average后面的三个数分别在刚刚过去的1分钟、5分钟、15分钟的负载情况,详细参见uptime命令。
load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
第二行,Tasks — 任务(进程),具体信息说明如下:
206 total, 系统现在共有206个进程
1 running, 其中处于运行中的有1个
205 sleeping, 205个在休眠(sleep)
0 stopped, stoped状态的有0个
0 zombie zombie状态(僵尸)的有0个
第三行,cpu状态信息,具体属性说明如下(关于cpu的使用率的计算,指的是一段时间内统计的处于在用状态的cpu时间片占该统计时间段的比例。比如linux的top命令貌似默认3秒统计一次。详细参考子节点cpu使用率):
5.9%us — 内存的用户空间部分程序占用CPU的百分比
3.4% sy — 内存的内核空间部分程序占用CPU的百分比。
0.0% ni — 改变过优先级的进程占用CPU的百分比
90.4% id — 空闲CPU百分比
0.0% wa — IO等待占用CPU的百分比等待输入输出的CPU时间百分比
0.0% hi — 硬中断(Hardware IRQ)占用CPU的百分比,CPU服务于硬件中断所耗费的时间总额
0.2% si — 软中断(Software Interrupts)占用CPU的百分比,CPU服务软中断所耗费的时间总额
0.0%st 虚拟机占用百分比
备注:在这里CPU的使用比率和windows概念不同,需要理解linux系统内存区划的用户空间和内核空间的相关知识,参见本节点的子节点介绍!
第四行,内存状态,具体信息如下:
32949016k total — 物理内存总量(32GB)
14411180k used — 使用中的内存总量(14GB)【使用中的内存总量(used)指的是现在系统内核控制的内存数,这里可以理解为特指分配给应用进程的内存+物理内存的buffers+物理内存的caches这3个的和,应用进程有最高优先级,当物理内存不足时,系统会将buffers缓存的数据写入到磁盘,将caches缓存的数据写入到交换区的chaches,从而为程序运行提供更多内存使用。也就是说,判断内存是否够用,主要的指标是判断访问高峰期,是否可以给应用程序运行提供足够的内存-亚强】
18537836k free — 空闲内存总量(18GB)【空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。】
169884k buffers — 缓存的内存量 (169M),用于暂时存放要写入到磁盘的数据,等待系统资源充足时候一次性写入磁盘速度更快。从而不必每次程序写入动作无需等待真正写入磁盘成功,将要写入的数据先存放到内存buffers缓冲区,程序直接继续执行下面的动作。
备注:关于真正的机器的可用内存,如果出于习惯去计算真正的可用内存数,这里有个近似的计算公式:第四行的free + 第四行的buffers + 第五行的cached(这个参数本身代表swap交换区的一段存储空间,只是该存储空间的大小也等于物理内存中系统开辟的cached存储区间,也就是交换区与物理内存都有cached缓冲区-亚强),按这个公式此台服务器的可用内存:18537836k +169884k +3612636k = 22GB左右。
对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
第五行,swap交换分区信息(也叫做虚拟物理内存,即在硬盘上开辟的一段空间,用于类似于内存功能,但是存取速度远低于内存,可以用于内存不足时使用),具体信息说明如下:
32764556k total — 交换区总量(32GB)
0k used — 使用的交换区总量(0K)
32764556k free — 空闲交换区总量(32GB)
3612636k cached — 缓冲的交换区总量(3.6GB),物理内存中的内容被换出到swap交换区,而后又被换入到物理内存,但使用过的swap交换区尚未被覆盖(注意这些尚未被覆盖的存储空间不计入第五行的used参数值,貌似被计入了第五行的free中,因为这段内存空间如果系统需要,就会被覆盖掉,因此被计入到了free变量),该数值即为这些内容已存在于物理内存中的交换区的大小,相应的内存,再次被换出时可不必再对swap交换区写入。也就是该参数值得内存中的一段存储空间,这段空间中存储着在交换区的一段空间数据,但是注意该交换区的数据实际已经被注销掉,成为空闲空间free,你知道即使成为空闲空间,那么如果没有新数据写入覆盖掉该段存储空间,那么这段空间的数据是不会丢失的,因此当与之对应的内存中的当时调入内存中的同样的数据由于系统调用再次被调出到swap交换区(这段数据已经存在于交换区),那么系统不会重新将这段数据写入交换区,而是将原来已经存在于交换区的数据标志为可用即可。
综上:【亚强】缓冲交换区cached是swap交换区中的一段空间,该空间存储着从物理内存调入到swap交换区且又被物理内存调回到物理内存的数据且尚未被从物理内存新调入到swap交换区的数据覆盖掉的在swap交换区所占存储空间。当系统需要再次调出物理内存中的这些已经存在于cached中的数据到swap交换区,那么系统不会重新写入数据到swap交换区,而是将原来的这些存在于cached中的注销标记改为数据可用即可(从而加快了数据交互速度)。这些用于cached缓冲交换区的存储空间,当从物理内存中调入交换区swap的数据量很大时,那么新调入的数据就可能要覆盖掉这些cached所占空间的有注销标记的数据。因此cached缓冲交换区单独拿出来,不被计入到used参数下,而是计入到free参数下,因为cached仍然是可以被使用的。
亚强(强商科技)注释:关于linux内存管理机制(物理内存(分为程序使用的内存和buffers,cached)和虚拟内存(swap交换分区)),详细参见本阶段下面的【linux内存管理机制】节点。
第六行,空行
第七行以下:各进程(任务)的状态监控,项目列信息说明如下:
默认情况下仅显示比较重要的 PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND 列。可以通过下面的快捷键来更改显示内容。
序号 列名 含义 a PID 进程id b PPID 父进程id c RUSER Real user name d UID 进程所有者的用户id e USER 进程所有者的用户名 f GROUP 进程所有者的组名 g TTY 启动进程的终端名。不是从终端启动的进程则显示为 h PR 进程优先级(本字段介绍参加本手册节点的子节点) i NI nice值。负值表示高优先级,正值表示低优先级(本字段介绍参加本手册节点的子节点),即值越小优先级越高,参见本手册本节点的子节点。优先级部分 j P 最后使用的CPU,仅在多CPU环境下有意义 k %CPU 上次更新到现在的CPU时间占用百分比,The task's share(分配) of the elapsed(消逝的) CPU time since the last screen
update, expressed as a percentage of total CPU time. In a true SMP environment, if 'Irix mode' is Off, top will operate in
'Solaris mode' where a task's cpu usage will be divided by the total number of CPUs.You toggle 'Irix/Solaris' modes with
the 'I' interactive command.可以用I来切换Irix/Solaris模式,在多核心的cpu系统中,%cpu列将根据上一次更新时刻到本次更新时刻每个cpu的总时间
分为100份,即如果有n个cpu核心,那么总时间份数为n*100份。那么每个进程的份数累加最大可以达到n*100.如果运行在Irix模式下,那么每个进程
的%cpu字段的值为上一次更新时刻到本次更新时刻所有cpu核心处理器分配给该进程的份数总和与n*100的比例,即此种情况是相对于全部cpu的时间份数总
额的占比。如果运行在Solaris模式下,那么每个进程的的%cpu字段的值为上一次更新时刻到本次更新时刻所有cpu核心处理器分配给该进程的份数总和与100
的比例,即此种情况是相对于每个cpu时间份数总额的占比(这里的cpu应该指的是逻辑cup格式,1个物理cpu可以有多个核心,着多个核心
也可以称为多个逻辑cpu)
l TIME 进程使用的CPU时间总计,单位秒,top命令的TIME/TIME+是指的进程所使用的CPU时间,不是进程启动到现在的时间,因此,如果一个进程使
用的cpu很少,那即使这个进程已经存在N长时间,TIME/TIME+也是很小的数值。此外,如果你的系统有多个CPU,或者是多核CPU的话,那么,进程占用多
个cpu的时间是累加的。 Total CPU time the task has used since it started. When ‘Cumulative mode’ is On, each process is listed with
the cpu time that it and its dead children has used. You toggle ‘Cumulative mode’ with ‘S’, which is a command-line option and an
interactive command. See the ‘S’ interactive command for additional information regarding this mode. m TIME+ 进程使用的CPU时间总计,单位1/100秒,top命令的TIME/TIME+是指的进程所使用的CPU时间,不是进程启动到现在的时间,因此,如果
一个进程使用的cpu很少,那即使这个进程已经存在N长时间,TIME/TIME+也是很小的数值。此外,如果你的系统有多个CPU,或者是多核CPU的话,那么,
进程占用多个cpu的时间是累加的。CPU Time, hundredths The same as ‘TIME’, but reflecting more granularity through hundredths of
a second n %MEM 进程使用的物理内存百分比 o VIRT 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES p SWAP 进程使用的虚拟内存中,被换出的大小,单位kb。 q RES 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA,这里指的是内存加数据。 r CODE 可执行代码占用的物理内存大小,单位kb s DATA 可执行代码以外的部分(数据段+栈)占用的物理内存大小,单位kb t SHR 共享内存大小,单位kb(本字段介绍参加本手册节点的子节点) u nFLT 页面错误次数 v nDRT 最后一次写入到现在,被修改过的页面数。 w S 进程状态(D=不可中断的睡眠状态,R=运行,S=睡眠,T=跟踪/停止,Z=僵尸进程,详细参见子节点【Linux进程状态解析 之 R、S、D、T、Z、X (主要有三个状态)】) x COMMAND 触发当前进程的命令名/命令行(可以用c来切换) y WCHAN 若该进程在睡眠,则显示睡眠中的系统函数名 z Flags 任务标志,参考 sched.h
其他使用技巧:
多U多核CPU监控
在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况,下面的cpu0,cpu1,cpu2,cpu3.....cpu15共计16个逻辑cpu:再按一下数字1,则返回主页面,显示cpu(s)的cpu性能。
观察上图,服务器有16个逻辑CPU,实际上是4个物理CPU。再按数字键1,就会返回到top基本视图界面。
高亮显示当前运行进程
敲击键盘“b”(打开/关闭加亮效果),top的视图变化如下:()
我们发现进程id为2570的“top”进程被加亮了,top进程就是视图第二行显示的唯一的运行态(runing)的那个进程,可以通过敲击“y”键关闭或打开运行态进程的加亮效果。
进程字段排序字段高亮显示
top -x
注意:使用-x开启排序高亮功能后,还需要使用-b命令给出是否高亮显示该排序的列。
默认进入top时,各进程是按照CPU的占用量来排序的,在下图中进程ID为28894的java进程排在第一(cpu占用142%),进程ID为574的java进程排在第二(cpu占用16%)。
敲击键盘“x”(打开/关闭排序列的加亮效果,如会将当前排序行,高亮显示),top的视图变化如下:
可以看到,top默认的排序列是“%CPU”。
排序字段: 通过”shift + >”或”shift + <”可以向右或左改变排序列(注意:该组合键是在开启了top之后,运行时按下的)
下图是按一次”shift + >”的效果图,视图现在已经按照%MEM来排序。
实例2:显示完整命令
命令:
top -c //亚强:该行貌似与直接写top效果一样
输出:
说明:
实例3:以批处理模式显示程序信息(高亮显示某些字段,与-x结合,可以控制显示当前排序字段高亮)
命令:
top -b
输出:
说明:
实例4:以累积模式显示程序信息
命令:
top -S
输出:
说明:
实例5:设置信息更新次数
命令:
top -n 2
输出:
说明:
表示更新两次后终止更新显示
实例6:设置信息更新时间,即间隔多少秒后更新,该参数支持浮点型数据,如top -d 0.2,每隔0.2秒刷新一次数据。
命令:
top -d 3
输出:
说明:
表示更新周期为3秒
实例7:显示指定的进程信息
命令:
top -p 574 //亚强:后面的数字是PID的值,即进程的id号
输出:
说明:
实例8:top交互命令(关于下面需要输入参数的命令如何返回到交互状态初始化状态,可以不输入任何参数,然后按下enter即可,如果输入参数,然后按下enter,那么执行当前交互命令,对于其他交互动作,可以用enter确认执行,用esc取消执行)
在top 命令执行过程中可以使用的一些交互命令。这些命令都是单字母的,如果在命令行中使用了s 选项, 其中一些命令可能会被屏蔽。
h 显示帮助画面,给出一些简短的命令总结说明,按任意键后返回到top列表界面。
k 终止一个进程。输入pid参数+enter即可以杀死该pid对应的进程。我们可以直接按下enter返回到top界面。
i 忽略闲置和僵死进程。这是一个开关式命令。
q 退出程序,//退出top命令
r 重新安排一个进程的优先级别
S 切换到累计模式
s 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms(比如0.1的效果是100ms)。输入0值则系统将不断刷新,默认值是3s(centos中)
f从当前显示中添加或者删除项目更改显示内容通过 f 键可以选择显示的内容。按 f 键之后会显示列的列表,按 a-z 即可显示或隐藏对应的列,最后按回车键确定。
F或O:选择当前排序字段,按下a-z中的某个按键确定排序字段,然后按下enter确认,按下esc取消。
o或者O 改变显示项目的顺序//进入该模式后,系统用a,b,c,d,e...n标记代表每一列的表头,我们通过按下【标记字母】,那么该字段后移动,按下【shift+标记字母】,则前移动。按 o 键可以改变列的显示顺序。按小写的 a-z 可以将相应的列向右移动,而大写的 A-Z 可以将相应的列向左移动。最后按回车键确定,按下esc取消。
l 字母l,切换显示平均负载和启动时间信息//top的第一行是否显示
1 数字1,在top基本视图中,按键盘数字“1”,可监控每个逻辑CPU的状况,下面的cpu0,cpu1,cpu2,cpu3.....cpu15共计16个逻辑cpu:再按一下数字1,则返回主页面,显示cpu(s)的cpu性能。
m 切换显示内存信息//top的第4,5行是否显示
t 切换显示进程和CPU状态信息//top的第2,3行是否显示
c 切换显示命令名称和完整命令行(亚强:(即commont字段内容的切换,貌似显示为请求类型与完整的该进程的触发命令行内容之间切换))显示整个命令行而不只是显示命令名 ,这里指的是command字段的列信息,将显示完整的开启该进程的命令行的信息/仅仅简略显示来切换显示。
M 根据驻留内存大小进行排序
P 根据CPU使用百分比大小进行排序
T 根据时间/累计时间进行排序
R 改变排序方式(升序/降序)
”shift + >”或”shift + <”:可以向右或左改变排序列(注意:该组合键是在开启了top之后,运行时按下的)
b 当前处于运行状态的行高亮/取消高亮(控制当前排序的行是否高亮,需要首先使用x开启排序高亮)
x 当前处于排序字段的列高亮/取消高亮(有时候直接按下x无效果,此时首先按一下b执行高亮显示)
I:切换Irix/Solaris模式,在多核心的cpu系统中,%cpu列将根据上一次更新时刻到本次更新时刻每个cpu的总时间分为100份,即如果有
n个cpu核心,那么总时间份数为n*100份。那么每个进程的份数累加最大可以达到n*100.如果运行在Irix模式下,那么每个进程的的%cpu字段的值为上一次更新时刻到本次更新时刻所有cpu核心处理器分配给该进程的份数总和与n*100的比例,即此种情况是相对于全部cpu的时间份数总额的占比。如果运行在Solaris模式下,那么每个进程的的%cpu字段的值为上一次更新时刻到本次更新时刻所有cpu核心处理器分配给该进程的份数总和与100的比例,即此种情况是相对于每个cpu时间份数总额的占比。
W 将当前设置写入~/.toprc文件中附常用操作:
top //每隔5秒显式所有进程的资源占用情况 top -d 2 //每隔2秒显式所有进程的资源占用情况 top -p 12345 -p 6789//每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况 top -d 2 -c -p 123456 //每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数