Linux – top命令详解

Linux – top命令详解

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

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

但本文还是要讲原始的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 MemKiB 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退出返回):

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

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

显示多个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 列的显示模式:

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

打赏

订阅评论
提醒
guest

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x

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

Linux – top命令详解