Linux中的top命令显示系统上正在运行的进程。它是系统管理员最重要的工具之一。被广泛用于监视服务器的负载,top命令是一个交互命令。在运行top的时候还可以运行很多命令。
1. Top 命令输出:
top命令会显示系统的很多信息。默认运行时,top命令会显示如下输出:
1.1 系统运行时间和平均负载:
top命令的顶部显示与uptime命令相似的输出。
这些字段显示:
-
当前时间
-
系统已运行的时间
-
当前登录用户的数量
-
相应最近5、10和15分钟内的平均负载。
可以使用’l’命令切换uptime的显示。
1.2 任务:
第二行显示的是任务或者进程的总结。进程可以处于不同的状态。这里显示了全部进程的数量。除此之外,还有正在运行、睡眠、停止、僵尸进程的数量(僵尸是一种进程的状态)。这些进程概括信息可以用’t’切换显示。
1.3 CPU 状态:
第三行显示的是CPU状态。 这里显示了不同模式下的所占CPU时间的百分比。这些不同的CPU时间表示:
-
us, user: 运行(未调整优先级的) 用户进程的CPU时间
-
sy,system: 运行内核进程的CPU时间
-
ni,niced:运行已调整优先级的用户进程的CPU时间
-
wa,IO wait: 用于等待IO完成的CPU时间
-
hi:处理硬件中断的CPU时间
-
si: 处理软件中断的CPU时间
-
st:这个虚拟机被hypervisor偷去的CPU时间(译注:如果当前处于一个hypervisor下的vm,实际上hypervisor也是要消耗一部分CPU处理时间的)。
可以使用’t’命令切换显示。
1.4 内存使用:
接下来两行显示内存使用率,有点像’free’命令。第一行是物理内存使用,第二行是虚拟内存使用(交换空间)。
物理内存显示如下:全部可用内存、已使用内存、空闲内存、缓冲内存。
相似地:交换部分显示的是:全部、已使用、空闲和缓冲交换空间。
内存显示可以用’m’命令切换。
1.5 字段/列:
在横向列出的系统属性和状态下面,是以列显示的进程。不同的列代表下面要解释的不同属性。
默认上,top显示这些关于进程的属性:
PID
进程ID,进程的唯一标识符
USER
进程所有者的实际用户名。
PR
进程的调度优先级。这个字段的一些值是’rt’。这意味这这些进程运行在实时态。
NI
进程的nice值(优先级)。越小的值意味着越高的优先级。
VIRT:virtual memory usage 虚拟内存
进程使用的虚拟内存。
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量
RES:resident memory usage 常驻内存
驻留内存大小。驻留内存是任务使用的非交换物理内存大小。
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小
SHR:shared memory 共享内存
SHR是进程使用的共享内存。
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来
DATA
1、数据占用的内存。如果top没有显示,按f键可以显示出来。
2、真正的该程序要求的数据空间,是真正在运行中要使用的。
S
这个是进程的状态。它有以下不同的值:
-
D – 不可中断的睡眠态。
-
R – 运行态
-
S – 睡眠态
-
T – 被跟踪或已停止
-
Z – 僵尸态
%CPU
自从上一次更新时到现在任务所使用的CPU时间百分比。
%MEM
进程使用的可用物理内存百分比。
TIME+
任务启动后到现在所使用的全部CPU时间,精确到百分之一秒。
COMMAND
运行进程所使用的命令。
还有许多在默认情况下不会显示的输出,它们可以显示进程的页错误、有效组和组ID和其他更多的信息。
1.6NI和PR区别
就是说在同一个调度周期中,优先级高的进程占用的时间长些,而优先级低的进程占用的短些。nice(NI)和priority(PR)
NICE值?
它是反应一个进程“优先级”状态的值,其取值范围是-20至19,一共40个级别
这个值越小,表示进程”优先级”越高,而值越大“优先级”越低。
过NICE命令来对一个将要执行的bash命令进行nice值设置,方法是:
>nice -n 10 bash
就又打开了一个bash,并且其nice值设置为10,而默认情况下,进程的优先级应该是从父进程继承来的,这个值一般是0。
我们可以通过nice命令直接查看到当前shell的nice值:
>nice
10
对比一下正常情况:
>exit > bash > nice 0
另外,使用renice命令可以对一个正在运行的进程进行nice值的调整,我们也可以使用比如top、ps等命令查看进程的nice值
nice值虽然不是priority,但是它确实可以影响进程的优先级。
在原来使用O1调度的Linux上,我们还会把nice值叫做静态优先级,这也基本符合nice值的特点,就是当nice值设定好了之后,除非我们用renice去改它,否则它是不变的。
而priority的值在之前内核的O1调度器上表现是会变化的,所以也叫做动态优先级。
什么是优先级和实时进程?
什么是priority值,就是ps命令中看到的PRI值或者top命令中看到的PR值。
总结一下概念:
用nice值表示NI值,或者叫做静态优先级,也就是用nice和renice命令来调整的优先级;
而实用priority值表示PRI和PR值,或者叫动态优先级。
本质区别:
在内核中,进程优先级的取值范围是通过一个宏定义的,这个宏的名称是MAX_PRIO,它的值为140。
而这个值又是由另外两个值相加组成的,一个是代表nice值取值范围的NICE_WIDTH宏,另一个是代表实时进程(realtime)优先级范围的MAX_RT_PRIO宏。
说白了就是,Linux实际上实现了140个优先级范围,取值范围是从0-139,这个值越小,优先级越高。nice值的-20到19,映射到实际的优先级范围是100-139。
新产生进程的默认优先级被定义为:
define DEFAULT_PRIO (MAX_RT_PRIO + NICE_WIDTH / 2)
实际上对应的就是nice值的0。
正常情况下,任何一个进程的优先级都是这个值,即使我们通过nice和renice命令调整了进程的优先级,它的取值范围也不会超出100-139的范围,除非这个进程是一个实时进程,那么它的优先级取值才会变成0-99这个范围中的一个。
Linux系统中运行的进程可以分成两类:1.实时进程 2.非实时进程 。它们的主要区别就是通过优先级来区分的。
所有优先级值在0-99范围内的,都是实时进程,所以这个优先级范围也可以叫做实时进程优先级,而100-139范围内的是非实时进程。
2. 交互命令:
top是一个交互命令
2.1 'h': 帮助
首先,我们可以用’h’或者’?’显示交互命令的帮助菜单。
2.2 ‘’ 或者 ‘’: 刷新显示
top命令默认在一个特定间隔(3秒)后刷新显示。要手动刷新,用户可以输入回车或者空格。
2.3 ‘A’: 切换交替显示模式
这个命令在全屏和交替模式间切换。在交替模式下会显示4个窗口(译注:分别关注不同的字段):
- Def (默认字段组)
- Job (任务字段组)
- Mem (内存字段组)
- Usr (用户字段组)
这四组字段共有一个独立的可配置的概括区域和它自己的可配置任务区域。4个窗口中只有一个窗口是当前窗口。当前窗口的名称显示在左上方。(译注:只有当前窗口才会接受你键盘交互命令)
可以用’a’和’w’在4个 窗口间切换。’a’移到后一个窗口,’w’移到前一个窗口。用’g’命令你可以输入一个数字来选择当前窗口。
2.4 "B": 触发粗体显示
一些重要信息会以加粗字体显示。这个命令可以切换粗体显示。
2.5 "d" 或"s": 设置显示的刷新间隔
当按下’d’或’s’时,你将被提示输入一个值(以秒为单位),它会以设置的值作为刷新间隔。如果你这里输入了1,top将会每秒刷新。
2.6 "l"、"t"、"m": 切换负载、任务、内存信息的显示
这会相应地切换顶部的平均负载、任务/CPU状态和内存信息的概况显示。