Linux – top命令详解

Linux – top命令详解

首先我要说一下,linux系统一般都默认自带top命令,但由于该命令显示的信息不是很友好,所以我也不知道是linux官方还是个人写了一个替代的命令htop,h我认为是hyper,即高级的意思,比如超级高铁就叫hyperloop,该命令界面如下:

Xnip2019-01-13_17-36-27.jpg

但本文还是要讲原始的top命令,因为htop就是界面优化操作优化,基本上信息还是跟top显示的类似的。

系统平均负载

这句前面的:top -是指这是top命令显示的界面,后面的内容跟uptime命令输出的完全一样。

top - 13:59:03 up 46 days,  3:40,  1 user,  load average: 0.17, 0.07, 0.01

13:59:03表示系统当前时间。
up 46 days表示系统最后一次启动(或重启)后到运行top命令时总的运行时间。
1 user表示当前系统中只有一个登录用户。
load average: 0.17, 0.07, 0.01表示系统的平均负载,三个数字分别表示最后一分钟的系统平均负载,最后五分钟的系统平均负载,最后十五分钟的系统平均负载。

任务信息汇总

在linux系统中,一般把进程和线程统称为任务。第二行信息是对当前系统中所有任务的统计。

Tasks:  41 total,   1 running,  40 sleeping,   0 stopped,   0 zombie

Tasks: 41 total 表示当前系统的进程总数为41个。
1 running 表示当前系统中有 1 个正在运行的进程。
40 sleeping 表示当前系统中有 269 个休眠的进程。
0 stopped 表示停止状态的进程数为 0。
0 zombie 表示处于僵尸状态的进程数为 0。

CPU 信息

%Cpu(s):  0.7 us,  0.4 sy,  0.0 ni, 99.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st

这里一共有八个字段,是我们了解 CPU 负载的主要依据。

us
us是user space的缩写,表示进程在用户地址空间中消耗CPU时间的百分比。像 shell程序、各种语言的编译器、数据库应用、web 服务器和各种桌面应用都算是运行在用户地址空间的进程。这些程序如果不是处于idle(空闲)状态,那么绝大多数的CPU时间都是运行在用户态。

sy
sy是system的缩写,表示进程在内核地址空间中消耗CPU时间的百分比。所有进程要使用的系统资源都是由Linux内核处理的。当处于用户态(用户地址空间)的进程需要使用系统的资源时,比如需要分配一些内存、或是执行IO操作、再或者是去创建一个子进程,此时就会进入内核态(内核地址空间)运行。事实上,决定进程在下一时刻是否会被运行的进程调度程序就运行在内核态。对于操作系统的设计来说,消耗在内核态的时间应该是越少越好。在实践中有一类典型的情况会使sy变大,那就是大量的IO操作,因此在调查IO相关的问题时需要着重关注它。

ni
ni是nice的缩写,可以通过nice值调整进程用户态的优先级。这里显示的ni表示调整过 nice 值的进程消耗掉的CPU时间。如果系统中没有进程被调整过nice值,那么ni就显示为0。

id
id是idle的缩写,表示CPU处于idle状态的百分比。一般情况下,us + ni + id应该接近 100%。

wa
wa是wait的缩写,表示CPU等待磁盘IO操作的时间。和CPU的处理速度相比,磁盘IO操作是非常慢的。有很多这样的操作,比如:CPU在启动一个磁盘读写操作后,需要等待磁盘读写操作的结果。在磁盘读写操作完成前,CPU只能处于空闲状态。Linux系统在计算系统平均负载时会把CPU等待IO操作的时间也计算进去,所以在我们看到系统平均负载过高时,可以通过wa来判断系统的性能瓶颈是不是过多的IO操作造成的。

hi & si
hi是hardware irq的缩写,si是software irq的缩写,irq是(interrupt request的缩写)。
这两个值表示系统处理中断消耗的时间。中断分为硬中断和软中断,hi 表示处理硬中断消耗的时间,si 表示处理软中断消耗的时间。硬中断是硬盘、网卡等硬件设备发送给 CPU 的中断消息,当 CPU 收到中断消息后需要进行适当的处理(消耗 CPU 时间)。软中断是由程序发出的中断,最终也会执行相应的处理程序(消耗 CPU 时间)。

st
st是steal time的缩写,只有Linux在作为虚拟机运行时st才是有意义的。它表示虚机等待CPU资源的时间(虚机分到的是虚拟CPU,当需要真实的CPU时,可能真实的CPU正在运行其它虚机的任务,所以需要等待)。

小写字母t可以控制是否显示任务信息汇总和CPU信息(按一下t不显示,再按一下t又显示回来)

内存信息

内存(KiB Mem)

KiB Mem :   786432 total,   133944 free,   457176 used,   195312 buff/cache

交换空间(KiB Swap)

KiB Swap:   786432 total,   764844 free,    21588 used.   227176 avail Mem

这两行跟free命令得到的结果是一样的:

              total        used        free      shared  buff/cache   available
Mem:         786432      462148      111736      137892      212548      221312
Swap:        786432       21588      764844

Mem:memory,即内存
Swap:交换空间(相当于windows的虚拟内存)
total:内存/交换空间总大小
used:已使用的内存/交换空间大小
free:剩余(未使用)的内存/交换空间大小
shared:被共享使用的物理内存大小
buff/cache:被buffer(缓冲区)和cache(缓存)使用的物理内存大小
available:还可以被应用程序使用的物理内存大小

理论上来说:available = free + buffer + cache,关于free命令的详解可查看 Linux – free命令详解

单位切换:
top命令中显示的内存和交换空间的默认单位为KiB(即KB),按大写的E可切换单位,不过它是循环切换,就是一直往上升从KiB到MiB,GiB、TiB、PiB、EiB,EiB是目前最大单位,最后又回到KiB。
另外按小写m可循环切换KiB MemKiB Swap显示方式。

任务详情

默认情况下这里会显示 12 列数据:

  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+  COMMAND
    1 root      20   0   43292   3100   1952 S  0.0  0.4   1:37.18 systemd

PID :P(process),即进程 ID。
USER:表示进程所有者的有效用户名称。简单说就是以哪个用户权限启动的进程。
PR:PR是priority的缩写,表示进程执行的优先级,PR 的值是以Linux内核的视角看到的进程执行的优先级。
NI:NI是nice的缩写,负值表示高优先级,正值表示低优先级,该值表示从用户视角看到的进程执行优先级。

VIRT:VIRT是virtual的缩写,表示进程使用的虚拟内存大小。
1、进程“需要的”虚拟内存大小,包括进程使用的库、代码、数据等
2、假如进程申请100m的内存,但实际只使用了10m,那么它会增长100m,而不是实际的使用量

RES:RES是resident的缩写,表示常驻内存
1、进程当前使用的内存大小,但不包括swap out
2、包含其他进程的共享
3、如果申请100m的内存,实际使用10m,它只增长10m,与VIRT相反
4、关于库占用内存的情况,它只统计加载的库文件所占内存大小

SHR:SHR是shared的缩写, 表示进程使用的共享内存的大小。
1、除了自身进程的共享内存,也包括其他进程的共享内存
2、虽然进程只使用了几个共享库的函数,但它包含了整个共享库的大小
3、计算某个进程所占的物理内存大小公式:RES – SHR
4、swap out后,它将会降下来

S:S是status的缩写,表示进程当前的状态。S 值有下面几种:
– D 不可中断的睡眠状态(uninterruptible sleep)
– R 正在运行的状态(running)
– S 睡眠状态(sleeping)
– T 跟踪或停止状态(traced or stopped)
– Z 僵尸状态(zombie)

%CPU 表示进程使用 CPU 的百分比。
%MEM 表示进程使用内存的百分比。
TIME+ 表示进程累计使用的 CPU 时间。
COMMAND 表示运行进程对应的程序。

单位切换:VIRT/RES/SHR这三个表示的内存占用情况,默认单位是KB(因为以KB显示数字较大,故不显示单位),按小写e可以切换单位,与前面的按大写E切换类似,它也会从KB切换到MB、GB、TB、PB、EB,最后返回到KB(但KB不会显示单位)

top命令的控制命令

l – 关闭或开启第一部分第一行top信息的表示
t – 关闭或开启第一部分第二行Tasks和第三行Cpus信息的表示
m – 关闭或开启第一部分第四行Mem和 第五行Swap信息的表示
N – 以PID的大小的顺序排列表示进程列表
P – 以CPU占用率大小的顺序排列进程列表
M – 以内存占用率大小的顺序排列进程列表
h – 显示帮助
n – 设置在进程列表所显示进程的数量
q – 退出top
s – 改变画面更新周期

配置top显示

top运行后,按f可进入配置界面:

Xnip2019-01-13_16-21-17.jpg

按方向键选择,按空格键选中(选中后有*号)

显示多个CPU核心的详细信息

无论系统中有多少个CPU核心,默认的CPU信息总是输出一行,即所有核心加起来的综合数据。能不能查看各个CPU核心单独的数据呢?答案是,可以的。按键盘上的数字1就可以在不同的视图之间切换了。

以某列对进程排序

按小写字母f进入排序设置界面,选择某一列,按小写s指定排序,然后退出。
奇怪的是默认主界面上并看不出是以哪列排序的!可以使用小写字母x来粗体显示当前排序的列。

还有一些预定义的命令可以直接完成以某列排序的功能,比如大写字母M以%MEM列排序;大写字母N以PID列排序;大写字母P以%CPU列排序;大写字母T以TIME+列排序。
M %MEM
N PID
P %CPU
T TIME+

反转排序的结果是常见的需求,大写字母 R 可以将当期排序的结果反转。

显示进程执行的完整命令

默认 COMMAND 列只显示程序的名字,并不包含程序的路径。有时能够看到程序的完整路径是很方便的。你可以通过小写字母c来切换 COMMAND 列的显示模式:

Xnip2019-01-13_16-39-20.jpg

不仅是程序的完整路径,连启动程序的参数都显示出来了!

隐藏idle的进程

按小写字母i隐藏或显示idle进程。

只显示某个用户的进程

按小写字母u后,会让你输入用户名,如果想切换回显示全部用户,则什么都不输入直接回车即可:

Xnip2019-01-13_16-41-57.jpg

top 命令的配置文件

top命令是有配置文件的,也就是说你通过命令修改的配置都可以保存下来。比如我在top运行后的界面按小写e可以切换占用内存的单位,然后按大写的W(即shift+w)即可保存配置,如下图,保存的时候还会提示,是保存到用户家目录下的.toprc文件中了,了解linux的童鞋肯定知道,用户家目录,有很多.xxxrc文件,比如.bashrc(如果你换zsh了就是.zshrc),.vimrc等等,这个rcresource configuration的缩写。

Xnip2019-01-13_17-28-21.jpg

显示帮助

在top命令运行后,按小写字母h即可显示帮助:

Xnip2019-01-13_16-45-37.jpg

本文参考:https://www.jb51.net/article/135411.htm

打赏

Leave a Reply

avatar

This site uses Akismet to reduce spam. Learn how your comment data is processed.

  Subscribe  
Notify of

扫码在手机查看
iPhone请用自带相机扫
安卓用UC/QQ浏览器扫

Linux – top命令详解