Linux – top命令详解
Table of Contents
首先我要说一下,linux系统一般都默认自带top命令,但由于该命令显示的信息不是很友好,所以我也不知道是linux官方还是个人写了一个替代的命令htop
,h我认为是hyper
,即高级的意思,比如超级高铁就叫hyperloop
,该命令界面如下:
但本文还是要讲原始的top命令,因为htop就是界面优化操作优化,基本上信息还是跟top显示的类似的。
这是是一个top命令输出的内容,下边我们分别讲解
top - 14:05:49 up 14 min, 1 user, load average: 0.00, 0.00, 0.00
Tasks: 88 total, 2 running, 86 sleeping, 0 stopped, 0 zombie
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 st
MiB Mem : 975.7 total, 83.9 free, 583.3 used, 308.5 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 256.5 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
933 systemd+ 20 0 1320636 418316 34328 S 0.3 41.9 0:04.19 mysqld
1464 root 20 0 9032 3856 3224 R 0.3 0.4 0:00.01 top
1 root 20 0 98364 9936 7620 S 0.0 1.0 0:02.40 systemd
系统平均负载
第一句如下所示,这句前面的top -
代表这是top命令显示的界面,后面的内容跟uptime
命令输出的完全一样。
top - 14:05:49 up 14 min, 1 user, load average: 0.00, 0.00, 0.00
14:05:49
表示系统当前时间;up 14 min
表示系统最后一次启动(或重启)后到运行top命令时总的运行时间;1 user
表示当前系统中只登录了一个用户(Linux是多用户系统,只要你有创建账号给别人,一个系统是可以登录多个用户的);load average: 0.00, 0.00, 0.00
表示系统的平均负载,三个数字分别表示最后一分钟的系统平均负载,最后五分钟的系统平均负载,最后十五分钟的系统平均负载。
任务信息汇总
在linux系统中,一般把进程和线程统称为任务。第二行信息是对当前系统中所有任务的统计。
Tasks: 88 total, 2 running, 86 sleeping, 0 stopped, 0 zombie
Tasks: 88 total
表示当前系统的进程总数为88个;2 running
表示当前系统中有2个正在运行的进程;86 sleeping
表示当前系统中有86个休眠的进程;0 stopped
表示停止状态的进程数为0;0 zombie
表示处于僵尸状态的进程数为0;
CPU 信息
%Cpu(s): 0.0 us, 0.3 sy, 0.0 ni, 99.3 id, 0.0 wa, 0.0 hi, 0.0 si, 0.3 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(Linux/Unix每个进程都拥有一个nice值,其取值范围为−20(高优先级)~19(低优先级),默认值为 0,该值影响它使用cpu的优先级,因为多任务系统本质上是分时间使用cpu)。
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正在运行其它虚拟机的任务,所以需要等待)。
一个虚拟机程序可能运行多个虚拟机(它些虚拟机共享使用物理cpu),steal time的意思是虚拟机管理程序从当前虚拟机中“偷走”了一些cpu使用时间用于其它虚拟机的运行(意味着当前虚拟机需要等待这么长时间才能再次使用cpu),如果一个虚拟机经常被“偷走”时间用于其它虚拟机,说明该虚拟机运行在一台负载比较严重的物理机上,大家都抢着用cpu,但是都不够用,就造成“你偷我,我偷你”的现象。
快捷键:小写字母t
可以控制是否显示任务信息汇总和CPU信息(不断按t,会在四种显示模式循环,按四次t可以回到最初界面)
内存信息
内存(MiB Mem)
MiB Mem : 975.7 total, 83.9 free, 583.3 used, 308.5 buff/cache
交换空间(MiB Swap)
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 256.5 avail Mem
这两行跟free命令得到的结果是一样的(不过free这里是KiB为单位):
total used free shared buff/cache available
Mem: 999092 597120 81156 796 320816 262784
Swap: 0 0 0
Mem:memory,即内存
Swap:交换空间(相当于windows的虚拟内存)
total:内存/交换空间总大小
used:已使用的内存/交换空间大小
free:剩余(未使用)的内存/交换空间大小
shared:被共享使用的物理内存大小
buff/cache:被buffer(缓冲区)和cache(缓存)使用的物理内存大小
available:还可以被应用程序使用的物理内存大小
理论上来说:available = free + buffer + cache,关于free
命令的详解可查看 Linux – free命令详解
单位切换快捷键:
top命令中显示的内存和交换空间的默认单位为KiB(当然有些默认是MiB),按大写的E
(注意是大写)可切换单位,不过它是循环切换,就是一直往上升从KiB到MiB,GiB、TiB、PiB、EiB,EiB是目前最大单位,最后又回到KiB。
另外按小写m
可循环切换KiB Mem
和KiB Swap
显示方式。
关于KiB与KB的区别:KiB是1024进制,即1024KiB=1MiB,1024MiB=1GiB,目前macOS和硬盘都是使用KB/MB为单位(进位为1000),而Windows/Linux使用的是KiB/MiB为单位(进位为1024),但Windows却写成KB/MB,造成1T硬盘在Windows下显示只有931M这种误会(而Linux直接写一个字母K或M,不会造成这种误会),另外内存条也是用的KiB,具体看这里。
任务详情
默认情况下这里会显示 12 列数据:
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
933 systemd+ 20 0 1320636 418316 34328 S 0.3 41.9 0:04.19 mysqld
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
可进入配置界面(按esc
退出返回):
按方向键选择,按空格键选中(选中后有*
号)
显示多个CPU核心的详细信息
无论系统中有多少个CPU核心,默认的CPU信息总是输出一行(这也是为什么它写成“%Cpu(s)”的原因),即所有核心加起来的综合数据。能不能查看各个CPU核心单独的数据呢?答案是,可以的。按键盘上的数字1
就可以在不同的视图之间切换了。
以某列对进程排序
按小写字母f
进入排序设置界面,选择某一列,按小写s
指定使用该列作为排序列(s表示sort),然后退出。
奇怪的是默认主界面上并看不出是以哪列排序的!可以使用小写字母x
来粗体显示当前排序的列。
还有一些预定义的命令可以直接完成以某列排序的功能,比如大写字母M
以%MEM列排序;大写字母N
以PID列排序;大写字母P
以%CPU列排序;大写字母T
以TIME+列排序。
M %MEM
N PID
P %CPU
T TIME+
反转排序的结果是常见的需求,大写字母R
可以将当前排序的结果反转。
显示进程执行的完整命令
默认 COMMAND 列只显示程序的名字,并不包含程序的路径。有时能够看到程序的完整路径是很方便的。你可以通过小写字母c
来切换 COMMAND 列的显示模式:
不仅是程序的完整路径,连启动程序的参数都显示出来了!
隐藏idle的进程
按小写字母i
隐藏或显示idle进程。
只显示某个用户的进程
按小写字母u
后,会让你输入用户名,如果想切换回显示全部用户,则什么都不输入直接回车即可:
top 命令的配置文件
top命令是有配置文件的,也就是说你通过命令修改的配置都可以保存下来。比如我在top运行后的界面按小写e
可以切换占用内存的单位,然后按大写的W(即shift+w)即可保存配置,如下图,保存的时候还会提示,是保存到用户家目录下的.toprc
文件中了,了解linux的童鞋肯定知道,用户家目录,有很多.xxxrc
文件,比如.bashrc
(如果你换zsh了就是.zshrc
),.vimrc
等等,这个rc
是resource configuration
的缩写。
显示帮助
在top命令运行后,按小写字母h
即可显示帮助:
本文参考:https://www.jb51.net/article/135411.htm