用过linux系统的人都知道top命令,它是Linux下一个最常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。
top显示系统当前的进程和其他状况,是一个动态显示过程,即可以通过用户按键来不断刷新当前状态。如果在前台执行该命令,它将独占前台直到用户终止该程序为止。比较准确的说,top命令提供了实时的对系统处理器的状态监视。它显示系统中CPU最“敏感”的任务列表,并可以按CPU使用、内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。下面就一一道来。
首先解释一下该命令的具体用法。
top使用格式:
top [-] [d] [p] [q] [c] [C] [S] [s] [n]
参数说明:
比如:
top // 每隔5秒显式所有进程的资源占用情况;
top -d 2 // 每隔2秒显式所有进程的资源占用情况;
top -c // 每隔5秒显式进程的资源占用情况,并显示进程的命令行参数(默认只有进程名);
top -p 12345 -p 6789 // 每隔5秒显示pid是12345和pid是6789的两个进程的资源占用情况;
top -d 2 -c -p 123456 // 每隔2秒显示pid是12345的进程的资源使用情况,并显式该进程启动的命令行参数;
然后,我们结合实际的例子,来聊一聊该命令执行过程中所输出的信息,如何进行解读:
top - 09:15:56 up 31 min, 2 users, load average: 0.01, 0.03, 0.05
内容 | 含义 |
---|---|
09:15:56 | 当前系统时间 |
up 31 min | 系统已经运行了31分钟(在这期间没有重启过) |
2 users | 当前有2个用户登录系统 |
load average: 0.01, 0.03, 0.05 | 过去1分钟、5分钟、15分钟内系统的负载情况 |
注:load average数据是每隔5秒钟检查一次活跃的进程数,然后按特定算法计算出的数值。如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了。
Tasks: 191 total, 2 running, 189 sleeping, 0 stopped, 0 zombie
这一行比较简单,就不多解释了,只说明一点,zombie表示僵尸进程,不理解的可自行百度。
%Cpu(s): 0.7 us, 0.5 sy, 0.0 ni, 98.8 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st
内容 | 含义 |
---|---|
0.7 us | 用户空间所占百分比 |
0.5 sy | 内核空间所占百分比 |
0.0 ni | 改变过优先级的进程所占百分比 |
98.8 id | 空闲进程所占百分比 |
0.0 wa | IO等待进程所占百分比 |
0.0 hi | 硬中断(Hardware IRQ)所占百分比 |
0.0 si | 软中断(Software Interrupts)所占百分比 |
0.0 st | 虚拟机所占百分比 |
同样也要说明一点,这里CPU的使用比率和windows概念不同,如果你不理解用户空间和内核空间,自行百度吧。
KiB Mem: 3081144 total, 1445648 used, 1635496 free, 323064 buffers
KiB Swap: 4191228 total, 0 used, 4191228 free. 527176 cached Mem
内容 | 含义 |
---|---|
3081144 total | 物理内存总量(3G) |
1445648 used | 使用中的内存总量(1.38GB) |
1635496 free | 空闲内存总量(1.56G) |
323064 buffers | 缓存的内存量 (315M) |
4191228 total | 交换分区总量(4G) |
0 used | 已使用的交换分区(0) |
4191228 free | 空闲状态的交换分区(4G) |
527176 cached Mem | 缓冲状态的交换分区(514K) |
这里要说明一下,我们不能用windows的内存概念来理解这些数据,Linux的内存管理有其特殊性,复杂点需要一本书来说明,这里只是简单说点和我们传统概念(windows)的不同。
MEM一行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。
对于内存监控,在top里我们要时刻监控SWAP一行中的已用数值used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。
首先说明一点,上述命令的显示状态,是在Ubuntu 14.04(64位)系统的缺省状态下所显示的。在其他的系统下,或者同一个系统的不同设置状态下,top命令所显示出来的列项目是有所区别的,有可能与上述图片中的不一样。换句话说,top命令其实能显示非常多的项目信息,远不止上述图片中所述,究竟有哪些呢,如下表所述:
序号 | 名称 | 含义 |
---|---|---|
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时间占用百分比 |
l | TIME | 进程使用的CPU时间总计,单位秒 |
m | TIME+ | 进程使用的CPU时间总计,单位1/100秒 |
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=僵尸进程) |
x | COMMAND | 命令名/命令行 |
y | WCHAN | 若该进程在睡眠,则显示睡眠中的系统函数名 |
z | Flags | 任务标志,参考 sched.h |
从上表可以看出,其实top命令可以显示的信息列最多有26列,每一列的代号分别对应为a-z,只不过在缺省状态下,系统只显示其中比较重要的【PID、USER、PR、NI、VIRT、RES、SHR、S、%CPU、%MEM、TIME+、COMMAND】列,而用户是完全通过指定的方式可以进行随意增减的。同时,在top命令运行的过程中,还可以进行一些其他的自定义设置,包括刷新速度、排序方式等,那么,究竟应该如何操作呢?请看下节:
上文说到,可以在输入top命令的时候携带一些参数来进行配置,可是有时候,输入top命令的时候,并不很清楚它的运行状态,有些参数也不知道如何设置,比如排序模式、需要显示的列等,而是要等到top命令运行起来了,才好进行设置。因此,有没有一种方法是在top命令运行的过程中,能够对其显示的模式、内容等进行临时的设置呢?
答案当然是有的!下面就介绍一下在top命令执行过程中可以使用的一些交互命令。从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。
怎么样,是不是非常灵活?自己去试试吧?