TOP命令的解释

简介: TOP命令的解释

20180626160909519.pngus: user cpu time (or) % CPU time spent in user space

sy: system cpu time (or) % CPU time spent in kernel space

ni: user nice cpu time (or) % CPU time spent on low priority processes

id: idle cpu time (or) % CPU time spent idle

wa: io wait cpu time (or) % CPU time spent in wait (on disk)

hi: hardware irq (or) % CPU time spent servicing/handling hardware interrupts

si: software irq (or) % CPU time spent servicing/handling software interrupts

st: steal time - - % CPU time in involuntary wait by virtual cpu while hypervisor is servicing another processor (or) % CPU time stolen from a virtual machine

翻译一下:

us:用户态使用的cpu时间比

sy:系统态使用的cpu时间比

ni:用做nice加权的进程分配的用户态cpu时间比

id:空闲的cpu时间比

wa:cpu等待磁盘写入完成时间

hi:硬中断消耗时间

si:软中断消耗时间

st:虚拟机偷取时间


1.    16:11为当前系统运行时间


2.    up  系统运行时间为73天19小时53分钟


3.    user  当前登录用户数


4.    load average 5.96、6.86、6.93  系统负载,任务队列不同时间段平均长度,分别为1分钟,5分钟,15分钟前到现在


5.    Tasks   1235 total,  当前进程总数


6.    2 running   正在运行的进程数


7 .   1233 sleeping   睡眠的进程数


8.    0 stop    停止的进程数


9.    0zombie   僵尸进程数


10  Cpu(s):  13.5%us,  用户空间占用CPU百分比


11                  1.3%sy,  内核空间占用CPU百分比


              0.0%ni, 用户进程空间内改变过优先级的进程占用CPU百分比


     85.1%id 空闲CPU


     0.0%wa  等待输入输出的CPU时间百分比


     0.0%hi    硬中断


     0.1%si    软中断


     0.0%st    实时


12.  Mem    264397992KB  total,      (250G)     内存总容量


                    227985520k   used,   (217G)使用的物理内存总量


                  36412472k     free,        (34G)      空闲内存总量


                    468688K       buffers,  (457M)  用做内核缓存的内存量



13.Swap     16777212K   total          (16G)       交换分区总量


                    199504k       used      (195M)  使用的交换分区总量


                    1621725k     free        (1.5G)    空闲的交换分区总量


                    168315904     cached  (160G)     缓冲的交换区总量    



-------------------------------------------------2019年11月14日13:21:03 update-----------------------------------------------------------


buffers 和 cached都是内存中存放的数据,不同的是,buffers存放的是准备写入磁盘的数据,而cache存放的是从磁盘中读取的数据。在Linux中有一个Dameon进程定期把buffer中的数据写入磁盘。使用sync手动把buffers中的数据写入磁盘,使用buffer的好处是:可以把分散的I/O 操作集中起来操作,减少了磁盘寻道的时间和磁盘碎片。


cache是Linux把读取频率高的数据存放到内存中,减少I/O。


第七行以下:各进程(任务)的状态监控

PID — 进程id

USER — 进程所有者

PR — 进程优先级

NI — nice值。负值表示高优先级,正值表示低优先级

VIRT — 进程使用的虚拟内存总量,单位kb。VIRT=SWAP+RES

RES — 进程使用的、未被换出的物理内存大小,单位kb。RES=CODE+DATA

SHR — 共享内存大小,单位kb

S — 进程状态。D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程

%CPU — 上次更新到现在的CPU时间占用百分比

%MEM — 进程使用的物理内存百分比

TIME+ — 进程使用的CPU时间总计,单位1/100秒

COMMAND — 进程名称(命令名/命令行)

----------------------------------------------2019/01/21  update------------------------------------------------------------


1、user% 和 sys%的比例是怎么计算出来的呢?

20190121101358504.png2、hi和si?


软硬中断请参照这位前辈的文章。


http://blog.csdn.net/pxz_002/article/details/7327668


3、ni?


进程执行的优先级,


ni是nice的意思,nice是什么呢,每个linux进程都有个优先级,优先级高的进程有优先执行的权利,这个叫做pri。进程除了优先级外,还有个优先级的修正值。即比如你原先的优先级是20,然后修正值为-2,那么你最后的进程优先级为18。这个修正值就叫做进程的nice值。


在每个进程的task_struct结构中有以下四项:policy、priority、counter、rt_priority。这四项是选择进程的依据。其中,policy是进程的调度策略,用来区分实时进程和普通进程,实时进程优先于普通进程运行;priority是进程(包括实时和普通)的静态优先级;counter是进程剩余的时间片,它的起始值就是priority的值;由于counter在后面计算一个处于可运行状态的进程值得运行的程度goodness时起重要作用,因此,counter也可以看作是进程的动态优先级。rt_priority是实时进程特有的,用于实时进程间的选择。

Linux用函数goodness()来衡量一个处于可运行状态的进程值得运行的程度。该函数综合了以上提到的四项,还结合了一些其他的因素,给每个处于可运行状态的进程赋予一个权值(weight),调度程序以这个权值作为选择进程的唯一依据。

对于普通进程,Linux采用动态优先调度,选择进程的依据就是进程counter的大小。进程创建时,优先级priority被赋一个初值,一般为0~70之间的数字,这个数字同时也是计数器counter的初值,就是说进程创建时两者是相等的。字面上看,priority是“优先级”、counter是“计数器”的意思,然而实际上,它们表达的是同一个意思—进程的“时间片”。Priority代表分配给该进程的时间片,counter表示该进程剩余的时间片。在进程运行过程中,counter不断减少,而priority保持不变,以便在counter变为0的时候(该进程用完了所分配的时间片)对counter重新赋值。当一个普通进程的时间片用完以后,并不马上用priority对counter进行赋值,只有所有处于可运行状态的普通进程的时间片(p->counter==0)都用完了以后,才用priority对counter重新赋值,这个普通进程才有了再次被调度的机会。这说明,普通进程运行过程中,counter的减小给了其它进程得以运行的机会,直至counter减为0时才完全放弃对CPU的使用,这就相对于优先级在动态变化,所以称之为动态优先调度。至于时间片这个概念,和其他不同操作系统一样的,Linux的时间单位也是“时钟滴答”,只是不同操作系统对一个时钟滴答的定义不同而已(Linux为10ms)。进程的时间片就是指多少个时钟滴答,比如,若priority为20,则分配给该进程的时间片就为20个时钟滴答,也就是20*10ms=200ms。


转自 https://blog.csdn.net/ppby2002/article/details/6621407


4、wa?


wa指的是CPU等待磁盘写入完成的时间,就是说前提是要进行IO操作,在进行IO操作的时候,CPU等待时间。比如上面那个程序,最后一步,从系统空间到dst硬盘空间的时候,如果程序是阻塞的,那么这个时候cpu就要等待数据写入磁盘才能完成写操作了。所以这个时候cpu等待的时间就是wa。


所以如果一台机器看到wa特别高,那么一般说明是磁盘IO出现问题,可以使用iostat等命令继续进行详细分析。


5、st?


st的名字很生动,偷取。。。是专门对虚拟机来说的,一台物理是可以虚拟化出几台虚拟机的。在其中一台虚拟机上用top查看发现st不为0,就说明本来有这么多个cpu时间是安排给我这个虚拟机的,但是由于某种虚拟技术,把这个cpu时间分配给了其他的虚拟机了。这就叫做偷取。


6、dstat 此命令可以清楚的看到sys / user 的占比

20190121105121684.png

转自: https://www.cnblogs.com/yjf512/p/3383915.html


------------------------------------------------------2019/1/21 update-------------------------------------------------------------------------



top -c 显示完整的命令。



按下 f 键,将P 打开

 j: P          = Last used cpu (SMP)

20200102190444656.png默认只显示带 * 的那几列,如果要打开那几列,将对应的字母选中即可。


例如 :如果想看到当前进程是哪一颗cpu在处理?需要打开P 这一列。


   选中:j: P          = Last used cpu (SMP)


   则多了一项:P 显示此进程使用哪个CPU。

20200102190944590.png从上图中可以看出 PID = 15872 同一个进程,在不同时刻,会使用不同的cpu Core。 这部分还待深入了解,这部分说明GP执行sql的时候并不是一个core 去执行该条sql,也就是说不应该存在阻塞的情况。


设置信息更新次数

命令:top -n 2

说明:表示更新两次后终止更新显示

设置信息更新时间

命令:top -d 3

说明:表示更新周期为3秒

20180824100128114.png通过上面的显示我们发现Cpu(s)表示的是 所有用户进程占用整个cpu的平均值,由于每个核心占用的百分比不同,所以按平均值来算比较有参考意义。而%CPU显示的是进程占用一个核的百分比,而不是整个cpu(12核)的百分比,有时候可能大于100,那是因为该进程启用了多线程占用了多个核心,所以有时候我们看该值得时候会超过100%,但不会超过总核数*100。


可以通过mpstat 查看每颗逻辑cpu的使用状况

例如每隔2秒输出一次,共输出100 <update 2020年1月2日14:09:27>

mpstat -P ALL 2 10020191230180913255.png以下是我们的CPU状况:

socket就是主板上插cpu的槽的数目,也就是可以插入的物理CPU的个数。

core就是我们平时说的“核“,每个物理CPU可以双核,四核等等。

thread就是每个core的硬件线程数,即超线程


  Architecture: #架构

 CPU(s): #逻辑cpu颗数

 Thread(s) per core: #每个核心线程

 Core(s) per socket: #每个cpu插槽核数/每颗物理cpu核数

 CPU socket(s): #cpu插槽数

 Vendor ID: #cpu厂商ID

 CPU family: #cpu系列

 Model: #型号

 Stepping: #步进

 CPU MHz: #cpu主频

 Virtualization: #cpu支持的虚拟化技术

 L1d cache: #一级缓存(google了下,这具体表示表示cpu的L1数据缓存)

 L1i cache: #一级缓存(具体为L1指令缓存)

 L2 cache: #二级缓存


内存剩余那么少系统会有问题吗?


多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。linux的内存管理机制与windows的有所不同。具体的机制我们无需知道,我们需要知道的是,linux的内存管理机制的思想包括(不敢说就是)内存利用率最大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作的系统,这种现象会更加明显。


直观的看,此时free的内存会非常小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。即:


可用内存;=free的内存+cached的内存+buffers的内存


所以,真正的内存利用率 = 可用内存 / 总内存(注意此处 可用内存 由上述公式计算而来,其实这个计算结果在free命令回显中已有,即回显结果第三行"-/+ buffers/cached",此行第二个数值即为加上了buffers和cached之后的内存,即为上述公式所算的可用内存


我们free一下

20180627163146251.png事实上可用物理内存还有192G 只是大多数被Cache。之所以被Cache是因为linux系统这样做可以提高内存的使用率。有频繁文件读写操作的系统的情况这种设计非常先进。


Cache:高速缓存,是位于CPU与主内存间的一种容量较小但速度很高的存储器。由于CPU的速度远高于主内存,CPU直接从内存中存取数据要等待一定时间周期,Cache中保存着CPU刚用过或循环使用的一部分数据,当CPU再次使用该部分数据时可从Cache中直接调用,这样就减少了CPU的等待时间,提高了系统的效率。Cache又分为一级Cache(L1 Cache)和二级Cache(L2 Cache),L1 Cache集成在CPU内部,L2 Cache早期一般是焊在主板上,现在也都集成在CPU内部,常见的容量有256KB或512KB L2 Cache。


Buffer:缓冲区,一个用于存储速度不同步的设备或优先级不同的设备之间传输数据的区域。通过缓冲区,可以使进程之间的相互等待变少,从而使从速度慢的设备读入数据时,速度快的设备的操作进程不发生间断。

 Free中的buffer和cache:(它们都是占用内存):

 buffer : 作为buffer cache的内存,是块设备的读写缓冲区

 cache: 作为page cache的内存, 文件系统的cache

 如果cache的值很大,说明cache住的文件数很多。如果频繁访问到的文件都能被cache住,那么磁盘的读IO 必会非常小。


2018/10/30:

A buffer is something that has yet to be “written” to disk.

A cache is something that has been “read” from the disk and stored for later use.

即buffer用于存放要输出到磁盘的数据,而cache是从磁盘读出存放到内存中待今后使用的数据。它们的引入均是为了提供IO的性能。


buffers/cached好处

Linux 内存管理做了很多精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache,目的就是为了提升磁盘IO的性能。从低速的块设备上读取数据会暂时保存在内存中,即使数据在当时已经不再需要了,但在应用程序下一次访问该数据时,它可以从内存中直接读取,从而绕开低速的块设备,从而提高系统的整体性能。

而Linux会充分利用这些空闲的内存,设计思想是内存空闲还不如拿来多缓存一些数据,等下次程序再次访问这些数据速度就快了,而如果程序要使用内存而系统中内存又不足时,这时不是使用交换分区,而是快速回收部分缓存,将它们留给用户程序使用。

因此,可以看出,buffers/cached真是百益而无一害,真正的坏处可能让用户产生一种错觉——Linux耗内存!

其实不然,Linux并没有吃掉你的内存,只要还未使用到交换分区,你的内存所剩无几时,你应该感到庆幸,因为Linux缓存了大量的数据,也许下一次你就从中受益


实测:

写入一个大文件,比较量测读入的实践:

1、生成一个1G的文件

dd if=/dev/zero of=/tem/test bs=1M count=1024 此命令在/tem/下建立一个名为test的1g的文件

2、清除缓存

echo 3 | tee /proc/sys/vm/drop_caches

3、读入这个文件,测试消耗时间

time cat bigfile > /dev/null

4、再次读入该文件,测试消耗的时间

time cat bigfile > /dev/null

5、可以看出第二次比第一次快了 0.014/0.002 = 7。

 

cache是高速缓存,用于CPU和内存之间的缓冲;

buffer是I/O缓存,用于内存和硬盘的缓冲


load average 1、5、15分钟内的平均负载分别是5.96、6.86、6.93.不甚理解其含义。于是找到了下面这片博客:



https://blog.csdn.net/zhangchenglikecc/article/details/52103737


以下内容多是来自以上博客。



在Linux中,进程分为三种状态,      一种是阻塞的进程blocked process,


               一种是可运行的进程runnable process,    


     另外就是正在运行的进程running process。当进程阻塞时,进程会等待I/O设备的数据或者系统调用。


进程可运行状态时,它处在一个运行队列run queue中,与其他可运行进程争夺CPU时间。 系统的load是指正在运行running one和准备好运行runnable one的进程的总数。比如现在系统有2个正在运行的进程,3个可运行进程,那么系统的load就是5,load average就是一定时间内的load数量均值

------------------------------------------------------------------------------------------------

CPU利用率和Load Average的区别


CPU利用率在过去常常被我们这些外行认为是判断机器是否已经到了满负荷的一个标准,看到50%-60%的使用率就认为机器就已经压到了临界了。CPU利用率,顾名思义就是对于CPU的使用状况,这是对一个时间段内CPU使用状况的统计,通过这个指标可以看出在某一个时间段内CPU被占用的情况,如果被占用时间很高,那CPU是否就需要考虑已经处于超负荷运作,长期超负荷运作对于机器本身来说是一种损害,因此必须将CPU的利用率控制在一定的比例下,以保证机器的正常运作。


Load Average是CPU的Load,它所包含的信息不是CPU的使用率状况,而是在一段时间内CPU正在处理以及等待CPU处理的进程数之和的统计信息,也就是CPU使用队列的长度的统计信息。为什么要统计这个信息,这个信息的对于压力


测试的影响究竟是怎么样的,那就通过一个类比来解释CPU利用率和Load Average的区别以及对于压力测试的指导意义。


我们将CPU就类比为电话亭,每一个进程都是一个需要打电话的人。现在一共有4个电话亭(就好比我们的机器有4核),有10个人需要打电话。现在使用电话的规则是管理员会按照顺序给每一个人轮流分配1分钟的使用电话时间,如果使用者在1分钟内使用完毕,那么可以立刻将电话使用权返还给管理员,如果到了1分钟电话使用者还没有使用完毕,那么需要重新排队,等待再次分配使用。


目录
相关文章
|
6月前
|
Shell
我来教你如何将cpu使用率up起来(shell脚本[含注释])
我来教你如何将cpu使用率up起来(shell脚本[含注释])
266 0
|
4天前
|
Unix Linux
【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)
【Linux】一文了解【进程优先级相关知识点】&【PRI / NI值】背后的修正原理(13)
|
4天前
|
安全 Linux 开发工具
linux(三十二)系统信息命令kill终止进程
linux(三十二)系统信息命令kill终止进程
42 2
|
4天前
|
存储 监控 Linux
linux环境下进程相关概念解释
进程概念 进程:程序的一个执行实例,正在执行的程序等。 内核观点:担当分配系统资源(CPU时间,内存)的实体。 程序员观点:进程 = 对应的代码和数据 + 进程对应的PCB结构体
61 0
|
Linux 调度
top命令输出的解释
top命令输出的解释
112 0
|
监控 Linux Windows
Linux常用命令 - top命令详解(重点)
Linux常用命令 - top命令详解(重点)
186 0
|
安全 网络协议 测试技术
|
缓存 监控 安全
top命令手册
top命令手册
405 0