top指令是Linux系统中常用的监控当前系统资源利用情况的指令,使用该指令可以直观的动态显示CPU、内存等资源的占用情况。
在指令讲解之前我们先来介绍下关于CPU的三种常态:
空闲态: 这意味着CPU当前处于空闲状态;
用户态: CPU当前在处理用户空间程序,例如处理邮件服务或编译器等;
系统态: CPU当前在处理内核程序,例如处理中断或进行资源管理。
想要查看CPU各种统计信息的话有很多方法,其中top指令是最常见的一种,在Linux命令行中输入top指令后会有如下显示:
可以看到由top指令产生的输出大体可分为两大部分:最上面的五行为系统资源信息的总体统计,通过一个空行隔开的下半部分为进程信息区,即运行中的各个进程的实时状态;其中系统资源信息区有如下五行:
系统负载信息:
此行的信息等同于使用uptime命令产生的结果,其中包含有系统当前时间、系统运行时长、用户连接数、系统平均负载这几个信息。
其中load average中的三个数据4.91、 2.30 和 1.19分别表示上一分钟、上五分钟和上十五分钟的系统负载均值,对于该值的评判还和当前系统中逻辑CPU的数目有关。
任务进程信息:
此行的信息包括有当前总进程数,处于运行状态的、休眠状态的、暂停状态的进程数以及僵尸进程数。
CPU状态信息:
Cpu(s): 0.3%us, 3.4%sy, 0.0%ni, 38.9%id, 56.7%wa, 0.0%hi, 0.7%si, 0.0%st
以上是对CPU运行状态的信息统计,其中各项指标的意义为:
0.3% us- (User Time)这表示处理器花费了它0.3%的时间去运行用户空间的程序。该程序可以是数据库服务、Web服务或其他桌面服务,正常情况下大部分非空闲状态的CPU都应该去处理用户程序。
3.4% sy - (System Time)系统时间代表CPU去运行内核程序所花费的时间。所有的进程和系统资源都是由内核所管理,当一个用户程序需要申请一些系统资源,例如申请一段内存或创建一个子进程时,此时内核便需要进行处理,实际上,决定CPU接下来处理哪些程序的调度器也属于内核的一部分。CPU用于处理内核程序的时间应该越短越好,但是当有很多I/O操作发生时该值会激增不少。
0.0% ni - (Nice Time)该值表示CPU花费在调整过优先级的用户程序上的时间。在Linux中,用户程序可以运行在默认的优先级上,也可以用更高的优先级运行。用户程序的优先级被分为40个级别,数值从-20到19,其中数值越低表示优先级越高,在Linux系统中用户的程序都是默认以0的优先级运行,而nice指令是改变进程优先级的常用命令之一。当一个系统没有被调整过优先级的程序时,该值便为0。
38.9% id - (Idle Time)这表示在上一个采样时期内,CPU有38.9%的时间都是处于空闲状态的。一般而言,CPU用于处理用户空间程序的时间 -us, 调整过优先级程序的时间 - ni 和空闲的时间 - id 相加总和应该接近100%。
56.7% wa - (Waiting Time)在计算机中,形如磁盘读写之类IO操作的速度会远低于CPU的处理速度。当一个程序准备进行读写操作并暂无其他任务而是等待结果时,这段时间便被记录进wa,换而言之,该值即为CPU等待IO操作完成前的空闲时间。
0.0% hi & 0.7% si - (Hard & Soft Irq Time)这两个值是表示CPU花费在中断处理上的时间。其中hi表示的是硬件中断而si表示的是软件中断。硬件中断是由形如磁盘或网络接口之类的外设产生并发往CPU的物理中断,它可以使CPU停止当前工作转而去处理中断; 软件中断则是由系统运行的程序所产生的,但软件中断不会发生在CPU层面上,而是在内核中。
0.0% st - (Steal Time) 这个值是针对于虚拟机而言的,当Linux作为运行在hypervisor上的虚拟机时,st这个值便是表示被强制等待(Involuntary wait)虚拟CPU的时间,即:一个hypervisor上的虚拟CPU花费在等待另一个运行在不同虚拟机上的虚拟CPU的时间。因为在实际中这些虚拟进程都是共享的同一些物理进程,所以当一个虚拟机想要运行而hypervisor调度器选择运行另外一个虚拟机时就会出现Steal Time。
内存状态信息
此行的信息表示比较直观,分别为:物理内存总量,使用中的内存总量、空闲的内存总量和缓存的内存总量。
其中值得注意的是,使用中的内存总量是指目前被内核所控制的内存数量,而空闲的内存总量则是还未被内核所管控的内存数量,同时被内核所控制不等同于都在使用中,还包括曾经被使用但目前被释放掉的内存,这些内存虽然可以再重复使用,但内核不会将其“归还”至空闲内存区了。
交换分区信息
交换分区是Linux系统在硬盘上为虚拟内存所预留存储空间,在系统运行时物理内存会与交换分区以页为单位进行数据交换,以此来扩大计算机的逻辑内存大小以及实现内存的重复利用。
在此行中的几项参数基本类似于内存状态信息的几项:交换分区总量、使用中的交换分区总量、空闲的交换分区总量和缓冲的交换分区总量。
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
在最上面的五行系统资源信息统计区下面是进程信息区,其中较为详细地显示了各个运行中进程的各项指数,从左到右依次为:
PID 进程id
USER 进程拥有者的用户名
PR (priority)优先级,此优先级被称为动态优先级,是由内核层面的概念;
NI (nice)优先值,此优先级是用户层面的概念,用户可以通过调整nice值来改变进程的优先级(即进程占用CPU时间的长短);
VIRT (virtual memory usage)进程所占用的虚拟内存总量,其中包括进程分配的堆栈空间、从磁盘加载的库以及和其他进程所共享的内存;
RES (resident memory usage)常驻内存,即进程实际占用的物理内存的大小,其不包括交换内存;
SHR (shared memory)共享内存,即进程与其他进程所共享的内存部分,例如进程所加载的共享库。其中需要注意的是,即使一个进程仅使用共享库里的某些函数,整个库都会映射至进程所占用的虚拟内存和共享内存中,但只有被调用函数的部分会被加载进常驻内存中。
S (process state)进程状态:
D : Uninterruptible sleep 不可中断的睡眠状态
R : Running 处于运行状态或可运行状态
S : Interruptible sleeping 睡眠状态
T : Traced or stopped 跟踪/停止
Z : Zombie 僵尸进程
%CPU 上次屏幕刷新到当前,该进程所占用的CPU百分比;
%MEM 进程当前所占用的物理内存大小;
TIME+ 进程占用的CPU时间总计,单位为10ms;
COMMAND 命令行或进程名称
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------
额外的操作技巧:
1) 在top视图界面按下数字键“1”可切换至每个逻辑CPU的监控界面,再次按下“1”后可切换回来:
2)按下shift + F键后可以调整当前进程信息区的排序依据:
可以看到当前是以CPU占用率来进行排序的,我们可以输入代表对应字段的字符来完成排序操作:例如输入n后回车即可通过内存占用率高低来进行排序。
当然对于top指令还有很多操作设置可以按需执行,此处仅列举一二,不再赘述。