一、top经典界面参数含义

1、系统状态
shell
top - 21:36:59 up 13 days, 45 min, 1 user, load average: 0.35, 0.12, 0.04- 现在的系统时间:21:36:59
- 系统已经启动了:13天45分钟
- 用户数量:1个
- 系统平均负载1分钟、5分钟、15分钟:0.35、0.12、0.04
系统平均负载指的是,在特定时间间隔内运行队列中的平均进程数。一个进程通常会在没有等待I/O操作、没有主动进入等待状态、没有被中止的情况下处于运行态。
Top的这个系统平均负载是每隔5秒检查一次活跃进程数计算得到的,如果这个数值除以逻辑CPU的数量:
- 小于0.70:正常
- 0.70~1.00:有一些负荷了,需要检查
- 1.00~5.00:刚好1个CPU处理1个进程,但占用了全部的CPU资源,应该马上检查进程是否有问题
- 大于5.00:系统超负荷运转
2、进程总体状态
shell
Tasks: 85 total, 1 running, 84 sleeping, 0 stopped, 0 zombie一共有85个进程,1个处于运行态,84个处于睡眠态,0个处于僵尸态
3、CPU状态
shell
%Cpu(s): 0.2 us, 0.1 sy, 0.4 ni, 99.2 id, 0.0 wa, 0.0 hi, 0.0 si, 0.0 st- us(user):运行未调整优先级的用户进程的CPU时间所占的百分比
- sy(system):运行内核进程的CPU时间所占的百分比
- ni(niced):运行已调整优先级的用户进程的CPU时间所占的百分比
- id:(idle)CPU空闲时间所占的百分比
- wa(IO wait):执行过程中用于等待IO完成的CPU时间所占的百分比
- hi(Hardware IRQ):处理硬件中断的CPU时间所占的百分比
- si(Software Interrupts):处理软件中断的CPU时间所占的百分比
- st(steal):虚拟CPU等待实际CPU时间所占的百分比
我们知道程序在进行系统调用(比如read等函数)、发生异常(比如缺页异常)、外围设备中断等操作陷入内核代码后,进程会从用户态进入系统态。
当us值过高,表示运行的应用消耗掉了大部分CPU,在这种情况下就要去找程序中消耗CPU线程所执行的代码,对java程序而言,可以去查看JVM是否频繁GC和因为什么频繁GC
当sy值过高,表用运行的应用过于频繁地进行线程上下文切换,线程不断地处于阻塞(锁等待、IO等待)和执行的状态变化过程中,对java程序而言,需要查看是否启动的线程太多,是否有并发锁竞争的问题。
通常,除了百分比的值,us比sy应该小于3:1~4:1才比较合理。
ni值可以用于观察调整过优先级的进程所占用CPU百分比。比如原本两个优先级为0的进程A和B,分别分配1时间片,提高B的优先级到-19后,A仍然1时间片,B分配1.5时间片,那么B多占了(1.5-1)/1.5+1=20%的CPU时间,这就是ni值。ni值越高说明调整后的进程抢占了其他进程越多的CPU资源。如果不是自己调的,一定要注意检查是否被入侵了,比如被挂了挖矿进程。
id值表明CPU空闲时间,我的服务器99.2%,说明没跑啥大程序,大部分CPU都浪费了……
st是被偷走的CPU时间,通常为0,这里的虚拟CPU指的不是逻辑CPU,而是整台服务器是运行在物理机上的虚拟机,那么st就是当CPU被分配给相同物理机的另一台虚拟机的时候,本虚拟机的虚拟CPU等待的时间。这个值越高,说明其他虚拟服务器占用的CPU越多,供应商过量地出售了虚拟云服务器,需要联系云服务器供应商扩容。
4、内存状态
shell
KiB Mem: 1024052 total, 945656 used, 78396 free, 187356 buffers
KiB Swap: 0 total, 0 used, 0 free. 359120 cached Mem第一行是物理内存,全部有1G内存(1024052字节),使用中的内存有0.9G左右,空闲内存0.1G左右,有0.17G(187356字节)的缓冲
第二行是虚拟交换内存,全部有0字节,使用中的有0字节,可用的有0字节(没有设置虚拟交换内存),有0.34G(359120字节)的缓存
缓冲(buffer)主要用于块设备的读写,缓存(cache)主要存储频繁访问的数据
空闲内存指的是完全没有被利用的内存,所以剩余的内存可用量并不是空闲内存,而是空闲内存+缓冲+缓存,比如这里就是0.1G+0.17G+0.34G=0.61G,还有一半内存可用呢。
要注意虚拟内存的used数值是否频繁变化,如果频繁变化,说明在不断地进行内存和虚拟内存的数据交换,这是内存不够用了的表现。
5、进程详细状态
shell
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
1 root 20 0 28900 5248 3148 S 0.0 0.5 0:12.74 systemd- PID(Process Id):进程ID
- USER(User Name):进程所有者的用户名
- PR(Priority):进程的动态优先级,“rt”代表实时态,取值0~39
- NI(Nice Value):进程的静态优先级,取值-20~19
- VIRT(Virtual Image):进程所用虚拟内存总量,单位KB
- RES(Resident Size):驻留内存大小,单位KB
- SHR(shared Memory):共享内存大小,单位KB
- S(Process State):进程状态
- %CPU(CPU Usage):上次更新到现在的CPU时间占用百分比
- %MEM(Memory Usage RES):进程使用的物理内存百分比(RES)
- TIME+(CPU Time,hundredths):启动后到现在使用的全部CPU时间,精确到1/100秒
- COMMAND(Command Name/Line):运行进程使用的命令
Linux一共有0~139共140个实际进程优先级,数字越小优先级越高,0~99是实时进程优先级,100~139是非实时进程优先级,系统会优先运行实时进程,只有实时进程让出CPU后才会运行非实时进程。所有新的非实时进程初始Nice值都是0,初始的实际优先级是(140 - 40/2)=120,所以可以通过-20~19的Nice值的调整来将实际优先级在100~139范围内调整。而实时进程的优先级都是根据指定策略动态变化的,实际优先级是看不见的,所以显示为“rt”,而普通非实时进程实际优先级可以通过PR+100=120+NI算出。
例如:
- PR=20,NI必定为0,实际优先级100+20或120+0为120;
- PR=0,NI必定为-20,实际优先级100+0或120-20为100;
- PR=rt,实际优先级必定在0~99之间,是实时进程。
所以PR主要用来判断是否是实时进程,NI主要用来判断非实时进程设置的优先级是多少。
- VIRT是进程需要的虚拟内存大小,包括库、代码、数据等,如果进程申请了200M内存,只用了10M,但这个值也会是200M,VIRT=SWAP+RES;
- RES是进程当前使用的内存大小,如果加载了库,只会统计加载的库文件所占内存大小,如果进程申请了200M内存,只用了10M,那么这个值就是10M,RES=CODE+DATA;
- SHR是共享内存大小,如果只用了库的几个函数,也会包含整个共享库的大小。
S是进程的状态,包括:
- R(Running) - 运行态
- S (Sleep)- 休眠态
- D(UnInterruptable) - 不可中断的休眠态
- T(Stopped or Traced) - 跟踪态或停止态
- Z(Zombie) - 僵尸态
- X(Exit)- 退出态
有关进程的状态后面可以再开一篇文章讲解,大部分进程都处于运行态和休眠态,这两个状态肯定是很好理解的,运行态可以去抢CPU,休眠态可能在等待某事件发生(比如信号量)。
%CPU是CPU占用率,如果CPU是多核,并且进程开了多个线程抢CPU,那么可能CPU的占用率会超过100%,最大为核心数*100%,例如4核最大占用率为400%
Time+的读法是按位的,单位分别是:1分钟、10秒、1秒、1/10秒、1/100秒,比如0:12.74就是01分钟+110秒+21秒+71/10秒+4*1/100秒。
二、top的调用方法
1、top参数运行
(1)top -c
COMMAND一列将会显示详细的启动命令,而不是只有命令名称:

(2)top -b
以批处理的方式运行。也就是刷新界面不是原地刷新,而是作为历史记录上移,这样可以将历史top信息保存起来便于查看变化过程。
(3)top -S
累积模式,会将已完成或消失的子进程的CPU Time也累积起来。
(4)top -n [次数]
在刷新打印n次之后退出top。配合top -c可以查看指定几次的变化,比如:
shell
top -n 2 -b > top.log(5)top -d [刷新间隔时间]
指定刷新间隔时间,默认是3秒
(6)top -p [PID]
只显示指定进程的信息,另外我尝试了一下用逗号分隔多个pid,发现真的可以展示多个:

这样只想看指定的多个进程就很方便了。
(7)top -s
安全模式,将不能使用交互式命令。
(8)top -i
不显示任何闲置(idle)或僵尸(zombie)进程。比如用了这个参数,就只有真的在跑的进程显示了:

对比一下普通的top,有大量的非活跃进程:

(9)top -u或-U [用户名或UID]
可以只查看某个用户的进程。
2、top交互式命令
交互式指的是,进入top界面后,再按键。
按h就可以看到了详细交互命令帮助了:

这里介绍几个常用的:
(1)E、e切换显示单位
E控制的是上面的内存信息单位,从KB到EB:

e控制的是下面的进程数据单位,从KB到PB:

(2)l、t、m
l:显示或隐藏第1行信息 top
t:显示或隐藏第2~3行信息 Tasks、%CPU(s)
m:显示或以藏第4行信息 Mem、Swap
(3)1
显示CPU详细信息,每核显示一行
(4)d/s
修改刷新频率
(5)n
指定显示行数,0表示无限制
(6)q
退出top
(7)M
根据驻留内存大小(RES)排序,这样能看到哪个进程占用内存大
(8)P
根据CPU使用百分比大小排序,能检查占用CPU多的进程
(9)T
根据时间/累积时间进行排序
(10)x
加亮排序列,可以看到当前是按照哪一列在排序
打开后可以配合shift+<或shift+>调整排序列
(11)y
加亮运行态(R)进程
(12)c
COMMAND列会显示详细的启动命令
(13)k
kill一个进程
(14)r
renice,调整一个进程的静态优先级
(15)W
将当前弄好的配置写入~/.toprc配置文件中,这样下次启动就不会变啦。
(16)最重要的F
可以选择排序列,可以选择当前显示的列有哪些:




粤公网安备44030602007943号