文章目录

一、top经典界面参数含义

1、系统状态

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、进程总体状态

Tasks:  85 total,   1 running,  84 sleeping,   0 stopped,   0 zombie

一共有85个进程,1个处于运行态,84个处于睡眠态,0个处于僵尸态

3、CPU状态

%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、内存状态

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、进程详细状态

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就是0*1分钟+1*10秒+2*1秒+7*1/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可以查看指定几次的变化,比如:

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

可以选择排序列,可以选择当前显示的列有哪些:

更多的命令已经放到wiki上供查阅。


转载请注明出处http://www.bewindoweb.com/264.html | 三颗豆子
分享许可方式知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议
重大发现:转载注明原文网址的同学刚买了彩票就中奖,刚写完代码就跑通,刚转身就遇到了真爱。
你可能还会喜欢
具体问题具体杠
  • QQ909090529
    评论于2019年07月27日
    大佬有没有QQ或者微信我也是做开发的 交个朋友可好
    三颗豆子
    回复于2019年07月27日
    已经加了,有感兴趣的话题就多交流吧。