首页 > 技术文章 > top命令详解

jeson-lbb 2018-12-01 13:19 原文

CentOS 7 的top命令经常用来监控Linux的系统状况,比如cpu、内存的使用、进程状况等。

刚进入top界面,默认是按%CPU从高到低排序的:

来结合这个视图讲解各个数据的含义。

系统平均负载

第一行:这和 uptime 命令的输出是一样的:

12:44:24 — 当前系统时间
2 days, 8:40 — 系统已经运行了2天8小时40分钟(在这期间没有重启过)
1 users — 当前有1个用户登录系统
load average: 2.63, 2.72, 2.75 — load average后面的三个数分别是1分钟、5分钟、15分钟的负载情况。如果数值大于CUP核数,就说明CUP超载了。(比如系统平均负载:4核CPU情况下,0.00 表示没有任何负荷,4.00表示刚好满负荷,超过4侧表示超负荷,理想值是2.8;)

任务信息汇总

第二行:

在 linux 系统中,一般把进程和线程统称为任务。第二行信息是对当前系统中所有任务的统计:
Tasks — 任务(进程),系统现在共有204个进程,其中处于运行中的有4个,200个在休眠(sleep),stoped状态的有0个,zombie状态(僵尸)的有0个。
说下僵尸进程:是因为子进程在没有执行完毕之前,自己的父进程被kill掉,父进程无法通知内核清理回收;子进程就成为了一个没娘的孩子,任由它自身自灭。

CPU 信息

第三行显示 CPU 的使用情况:


这里一共有八个字段,是我们了解 CPU 负载的主要依据,下面我们逐一介绍。
us
进程在用户地址空间中消耗 CPU 时间的百分比。像 shell程序、各种语言的编译器、数据库应用、web 服务器和各种桌面应用都算是运行在用户地址空间的进程。这些程序如果不是处于 idle 状态,那么绝大多数的 CPU 时间都是运行在用户态。
sy
进程在内核地址空间中消耗 CPU 时间的百分比。所有进程要使用的系统资源都是由 Linux 内核处理的。当处于用户态(用户地址空间)的进程需要使用系统的资源时,比如需要分配一些内存、或是执行 IO 操作、再或者是去创建一个子进程,此时就会进入内核态(内核地址空间)运行。事实上,决定进程在下一时刻是否会被运行的进程调度程序就运行在内核态。对于操作系统的设计来说,消耗在内核态的时间应该是越少越好。在实践中有一类典型的情况会使 sy 变大,那就是大量的 IO 操作,因此在调查 IO 相关的问题时需要着重关注它。
ni
ni 是 nice 的缩写,可以通过 nice 值调整进程用户态的优先级。这里显示的 ni 表示调整过 nice 值的进程消耗掉的 CPU 时间。如果系统中没有进程被调整过 nice 值,那么 ni 就显示为 0。
id
CPU 处于 idle 状态的百分比。一般情况下, us + ni + id 应该接近 100%。
wa
CPU 等待磁盘 IO 操作的时间。和 CPU 的处理速度相比,磁盘 IO 操作是非常慢的。有很多这样的操作,比如:CPU 在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU 只能处于空闲状态。Linux 系统在计算系统平均负载时会把 CPU 等待 IO 操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过 wa 来判断系统的性能瓶颈是不是过多的 IO 操作造成的。
hi & si
这两个值表示系统处理中断消耗的时间。中断分为硬中断和软中断,hi 表示处理硬中断消耗的时间,si 表示处理软中断消耗的时间。硬中断是硬盘、网卡等硬件设备发送给 CPU 的中断消息,当 CPU 收到中断消息后需要进行适当的处理(消耗 CPU 时间)。软中断是由程序发出的中断,最终也会执行相应的处理程序(消耗 CPU 时间)。
st
只有 Linux 在作为虚拟机运行时 st 才是有意义的。它表示虚机等待 CPU 资源的时间(虚机分到的是虚拟 CPU,当需要真实的 CPU 时,可能真实的 CPU 正在运行其它虚机的任务,所以需要等待)。
小写字母 t 可以控制是否显示任务信息汇总和 CPU 信息。没错,它能控制是否显示两行信息。

内存信息

第四、五行:内存信息包含两行内容,内存和交换空间:相当于执行free命令的结果。


1865284 total — 物理内存总量(1.865284GB)
81140 free — 空闲内存总量(81.14M)
1401604 used — 使用中的内存总量(1.401604GB)
382540 buff/cache — 缓存的内存量 (382.54M)
239704 avail Mem  --- 活动的,也就是真正可以用的内存(239.704M)

说明下他们之间的关系:
1865284 total=81140 free + 1401604 used + 382540 buff/cache
239704 avail Mem=382540 buff/cache + 81140 free - 固定不可用的内存

CentOS 6 free命令的区别:

total 1004112(本机总物理内存)= used 351100 (已分配的内存)+ free 653012 (未分配的内存) 或者
total 1004112(本机总物理内存)= used 275936(分配已使用的内存)+ free 728176  (未使用的总内存)
used 351100 (已分配的内存)    = buffers 15564 + cached 59600 (已分配未使用的内存) + used 275936(分配已使用的内存)
free 728176  (未使用的总内存) = buffers 15564 + cached 59600 (已分配未使用的内存) + free 653012 (未分配的内存)

第五行:swap交换分区(没有分交互分区)
0 total — 交换区总量
0 used — 使用的交换区总量
0 free — 空闲交换区总量

第六行默认是空行

任务详情

第七行以下:默认情况下这里会显示 12 列数据,都是我们比较关心的进行相关的信息,下面我们一个一个的介绍。
PID 表示进程 ID。
USER 表示进程所有者的有效用户名称。
PR 表示进程执行的优先级,PR 的值是以 Linux 内核的视角看到的进程执行的优先级。
NI 从用户视角看到的进程执行优先级。注意 NI 值为 -20 的进程,它们的 PR 值都是 0。
VIRT 表示进程使用的虚拟内存大小。
RES 表示进程使用的物理内存大小。
SHR 表示进程使用的共享内存的大小。
S 表示进程当前的状态。S 值有下面几种:
  D 不可中断的睡眠状态(uninterruptible sleep)
  R 正在运行的状态(running)
  S 睡眠状态(sleeping)
  T 跟踪或停止状态(traced or stopped)
  Z 僵尸状态(zombie)
%CPU 表示进程使用 CPU 的百分比。
%MEM 表示进程使用内存的百分比。
TIME+ 表示进程累计使用的 CPU 时间。
COMMAND 表示运行进程对应的程序。

一般情况下这些信息足够了,但是如果你还想要更多的信息,按下小写字母 f 可以进入任务信息的配置界面。

一些常用指令的用法:

刚进入top界面:

按下“b”键之后:

按下“x”键之后:

按1可以查看有几核CUP及各个CUP的当前状态:

一些常用的命令N键PID、C键%CPU、 M键%MEM 、 T 键TIME+ 、 进行排序,R列的升降序切换,也可以shift + < 或者 shift + > 进行列的切换。1为查看CPU核数。

其他实用命令:从使用角度来看,熟练的掌握这些命令比掌握选项还重要一些。这些命令都是单字母的,如果在命令行选项中使用了s选项,则可能其中一些命令会被屏蔽掉。

h或者? 显示帮助画面,给出一些简短的命令总结说明。
Help for Interactive Commands - procps version 3.2.8
Window 1:Def: Cumulative mode Off. System: Delay 3.0 secs; Secure mode Off.
Z,B    Global: 'Z' change color mappings; 'B' disable/enable bold
Z:修改颜色配置;B:关闭/开启粗体
l,t,m   Toggle Summaries: 'l' load avg; 't' task/cpu stats; 'm' mem info
l:隐藏/显示第1行负载信息;t:隐藏/显示第2~3行CPU信息;m:隐藏/显示第4~5行内存信息;
1,I    Toggle SMP view: '1' single/separate states; 'I' Irix/Solaris mode
1:单行/多行显示CPU信息;I:Irix/Solaris模式切换
f,o   . Fields/Columns: 'f' add or remove; 'o' change display order
f:列显示控制;o:列排序控制,按字母进行调整
F or O . Select sort field 选择排序列
<,>   . Move sort field: '<' next col left; '>' next col right 上下移动内容
R,H   . Toggle: 'R' normal/reverse sort; 'H' show threads
R:内容排序;H:显示线程
c,i,S  . Toggle: 'c' cmd name/line; 'i' idle tasks; 'S' cumulative time
c:COMMAND列命令名称与完整命令行路径切换;i:忽略闲置和僵死进程开关;S:累计模式切换
x,y   . Toggle highlights: 'x' sort field; 'y' running tasks
x:列排序;y:运行任务
z,b   . Toggle: 'z' color/mono; 'b' bold/reverse (only if 'x' or 'y')
z:颜色模式;b:粗体开关 仅适用于x,y模式中
u . Show specific user only 按用户进行过滤,当输入错误可按Ctrl + Backspace进行删除
n or # . Set maximum tasks displayed 设置进程最大显示条数
k,r    Manipulate tasks: 'k' kill; 'r' renice
k:终止一个进程;r:重新设置一个进程的优先级别
d or s  Set update interval 改变两次刷新之间的延迟时间(单位为s),如果有小数,就换算成ms。输入0值则系统将不断刷新,默认值是5s;
W Write configuration file 将当前设置写入~/.toprc文件中
q Quit   退出

( commands shown with '.' require a visible task display window )
注意:带.的命令需要一个可见的任务显示窗口

top命令使用使用格式:
top [-] [d] [p] [q] [c] [C] [S] [s]  [n]
参数说明
d 指定每两次屏幕信息刷新之间的时间间隔。当然用户可以使用s交互命令来改变之。
p 通过指定监控进程ID来仅仅监控某个进程的状态。
q 该选项将使top没有任何延迟的进行刷新。如果调用程序有超级用户权限,那么top将以尽可能高的优先级运行。
S 指定累计模式
s 使top命令在安全模式中运行。这将去除交互命令所带来的潜在危险。
i 使top不显示任何闲置或者僵死进程。
c 显示整个命令行而不只是显示命令名

附常用操作:
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的进程的资源使用情况,并显式该进程启动的命令行参数

推荐阅读