Linux性能监控常用命令

由于Oracle大多运行在Linux系统下,所以了解一些相关知识还是很有必要的,本文将主要梳理汇总在Linux性能监控方面常用到的一些命令。


TOP
TOP命令提供了对系统处理器的实时状态监视信息,它会显示CPU使用量、内存使用量、交换内存、缓存大小、缓冲区大小、流程PID、用户、命令等。
TOP信息可以分为两部分,光标上面部份显示关于系统整体性能,光标下面部份显示各进程信息,光标所在处是用来输入操作命令的。

【系统整体性能统计信息】

第一行:top - 12:38:33 up 50 days, 23:15,  7 users,  load average: 60.58, 61.14, 61.22
详解(基础信息):
12:38:33(系统当前时间)、up 50 days(系统开机至今时间)、7 users(当前登录系统用户数)、load average: 60.58, 61.14, 61.22(系统1、5、15分钟平均活跃进程数,如果这个数除以逻辑CPU的数量,结果高于5的时候就表明系统在超负荷运转了)。

第二行:Tasks: 203 total,  60 running, 139 sleeping,   4 stopped,   0 zombie
详解(进程信息):
203 total(系统当前进程数)、60 running(运行中进程数)、139 sleeping(休眠进程数)、4 stopped(停止进程数)、0 zombie(僵尸进程数)。

第三行:Cpu(s)  : 27.0%us, 33.0%sy,  0.0%ni,  40.0%id,  0.0%wa,  0.0%hi,  0.0%si,  0.0%st
详解(CPU信息):
27.0%us(用户空间占用CPU的百分比)、33.0%sy(内核空间占用CPU的百分比)、0.0%ni(改变过优先级的进程占用CPU的百分比)、40.0%id(空闲CPU百分比)、0.0%wa(IO等待占用CPU的百分比)、0.0%hi(硬中断占用CPU的百分比)、0.0%si(软中断占用CPU的百分比)、0.0%st(不知道)。

第四行:Mem:   1939780k total,  1375280k used,   564500k free,   109680k buffers
详解(内存信息):
1939780k total(物理内存总量)、1375280k used(已用物理内存量)、564500k free(空闲物理内存量)、109680k buffers(用于内核缓存的物理内存量)。

第五行:Swap:  4401800k total,   497456k used,  3904344k free,   848712k cached
详解(交换分区):
4401800k total(交换区总量)、497456k used(已用交换区总量)、3904344k free(空闲交换区总量)848712k cached(缓冲的交换区总量)。

交换分区类似于Windows的虚拟内存,就是当内存不足的时候,把一部分硬盘空间虚拟成内存使用,从而解决内存容量不足的情况。缓冲交换区cached作用原理为,内存中的内容被换出到交换区,而后又被换入到内存,但使用过的交换区尚未被覆盖,该数值即为这些内容已存在于内存中的交换区的大小,相应的内存再次被换出时可不必再对交换区写入。


第四行中使用中的内存总量(used)指的是现在系统内核控制的内存数,空闲内存总量(free)是内核还未纳入其管控范围的数量。纳入内核管理的内存不见得都在使用中,还包括过去使用过的现在可以被重复利用的内存,内核并不把这些可被重新使用的内存交还到free中去,因此在linux上free内存会越来越少,但不用为此担心。如果出于习惯去计算可用内存数,这里有个近似的计算公式:第四行的free+第四行的buffers+第五行的cached。对于内存监控,在top里我们要时刻监控第五行swap交换分区的used,如果这个数值在不断的变化,说明内核在不断进行内存和swap的数据交换,这是真正的内存不够用了。


【进程信息】
PID            USER         PR    NI     VIRT                   RES            SHR           S       %CPU       %MEM     TIME+      COMMAND
4338         oracle       25     0       627m        209m        207m        R       0       11.0 297:14.76         oracle

字段说明:
PID(进程ID)、USER(进程所有者)、PR(优先级)、NI(nice值,负值表示高优先级,正值表示低优先级)、VIRT(进程占用的虚拟内存总量,单位kb)、RES(进程占用的物理内存)、SHR(进程使用的共享内存)、S(进程状态,D=不可中断的睡眠状态 R=运行 S=睡眠 T=跟踪/停止 Z=僵尸进程)、%CPU(上次更新到现在的CPU时间占用百分比)、%MEM(进程使用的物理内存百分比)、TIME+(进程使用的CPU时间总计,单位1/100秒)、COMMAND(进程名称,命令名或命令行)。

进程信息排序:
默认进入top时,各进程是按照CPU的占用量来排序的。可以通过键盘指令改变排序字段,b(行加亮效果打开/关闭)、x(列加亮效果打开/关闭)、shift + >或shift + <(向右或左改变排序列)。

控制进程信息显示字段:
敲击f键,进入显示字段编辑视图,进程字段前有*且前标字母是大写的表示已显示的,没有*且小写的是未显示的,可以通过敲击进程前标字母来控制字段是否显示。


【交互命令】
q:退出top命令
:立即刷新

o:改变列显示顺序,按小写的a-z可以将相应的列向右移动,而大写的A-Z可以将相应的列向左移动,最后按回车键确定。按大写的F或O键,然后按a-z可以将进程按照相应的列进行排序,而大写的R键可以将当前的排序倒转,设置完按回车返回界面。

c:显示命令完全模式

t:显示或隐藏进程和CPU状态信息

m:显示或隐藏内存状态信息

l:显示或隐藏uptime信息

f:增加或减少进程显示标志

S:累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+

s:设置刷新时间间隔

P:按%CPU使用率排行

T:按TIME+排行

M:按%MEM排行

u:指定显示用户进程

r:修改进程renice值

k:终止一个进程

i:只显示正在运行的进程,忽略闲置或僵死进程

W:保存对top的设置到文件~/.toprc,下次启动将自动调用toprc文件的设置。

h:帮助命令。

top命令是Linux上进行系统监控的首选命令,但有时候却达不到我们的要求,可以用ps和netstate两个命令来补充top的不足。


监控java线程数:
ps -eLf | grep java | wc -l

监控网络客户连接数:

netstat -n | grep tcp | grep 侦听端口 | wc -l


上面两个命令,可改动grep的参数,来达到更细致的监控要求。

PS
PS是Process Status的缩写,用来列出系统当前进程,它提供的是命令执行时刻的静态进程信息,若想获取动态进程信息则要用top,结束进程使用kill。

进程状态
R:运行running,正在运行或在运行队列中等待;
S:中断sleeping,休眠中或受阻,在等待某个条件的形成或接受到信号;
D:不可中断,收到信号不唤醒或不可运行,进程必须等待直到有中断发生;
T:停止stop,进程收到SIGSTOP,STGSTP,SIGTOU信号后停止运行;
Z:僵死zombie,进程已终止但进程描述存在,直到父进程调用wait4()系统后释放;

命令参数
a:显示现行终端下的所有程序,包括其他用户的程序;
-a:显示所有终端机下执行的程序,除了阶段领导者之外;
-A:显示所有进程;
u:以用户为主的格式来显示详细信息;
-u:列出属于该用户的进程状况,也可指定用户,注与u不同;
x:显示所有进程,不以终端来区分;

统计信息
aux输出为:USER PID %CPU %MEM VSZ RSS TTY STAT START TIME COMMAND
字段说明:
USER(进程所有者)、PID(进程ID)、%CPU(CPU占用率)、%MEM(内存占用率)、VSZ(虚拟内存占用)、RSS(内存占用)、TTY(终端装置号)、STAT(进程状态)、START(进程启动时间)、TIME(进程消耗CPU时间)、COMMAND(进程执行命令名)。

-ef输出为:UID PID PPID C STIME TTY TIME CMD

VMSTAT
vmstat是Virtual Memory Statistics(虚拟内存统计)的缩写,它是一种低开销的系统性能观察方式,不足之处是只能查看系统整体情况而无法对某个进程进行深入分析。物理内存是真正的内存,而虚拟内存是在物理内存在不足情况下的补充,它存在于磁盘,用作虚拟内存的磁盘空间被称为交换空间。

虚拟内存及其原理

linux的内存管理采取的是分页存取机制,为了保证物理内存能得到充分的利用,内核会在适当的时候将物理内存中不经常使用的数据块自动交换到虚拟内存中,而将经常使用的信息保留到物理内存。于是,有时我们会看到这么一个现象:linux物理内存还有很多,但是交换空间也使用了很多。其实,这并不奇怪,例如,一个占用很大内存的进程运行时,需要耗费很多内存资源,此时就会有一些不常用页面文件被交换到虚拟内存中,但后来这个占用很多内存资源的进程结束并释放了很多内存时,刚才被交换出去的页面文件并不会自动的交换进物理内存,除非有这个必要,那么此刻系统物理内存就会空闲很多,同时交换空间也在被使用,就出现了刚才所说的现象了。关于这点,不用担心什么,只要知道是怎么一回事就可以了。


在系统中运行的每个进程都需要使用到内存,但不是每个进程都需要每时每刻使用系统分配的内存空间。当系统运行所需内存超过实际的物理内存,内核会释放某些进程所占用但未使用的部分或所有物理内存,将这部分资料存储在磁盘上直到进程下一次调用,并将释放出的内存提供给有需要的进程使用。


在Linux内存管理中,主要是通过“调页Paging”和“交换Swapping”来完成上述的内存调度。调页算法是将内存中最近不常使用的页面换到磁盘上,把活动页面保留在内存中供进程使用。交换技术是将整个进程,而不是部分页面,全部交换到磁盘上。


分页(Page)写入磁盘的过程被称作Page-Out,分页(Page)从磁盘重新回到内存的过程被称作Page-In。当内核需要一个分页时,但发现此分页不在物理内存中(因为已经被Page-Out了),此时就发生了分页错误(Page Fault)。


当系统内核发现可运行内存变少时,就会通过Page-Out来释放一部分物理内存。经管Page-Out不是经常发生,但是如果Page-out频繁不断的发生,直到当内核管理分页的时间超过运行程式的时间时,系统效能会急剧下降。这时的系统已经运行非常慢或进入暂停状态,这种状态亦被称作thrashing(颠簸)。


命令参数


vmstat [参数] [interval] [count]


interval:刷新时间间隔,单位秒,若不指定则仅显示命令执行时刻一次的状态信息;


count:刷新次数,在指定delay刷新间隔的情况下若不指定该参数则刷新次数无穷;


-a:显示活跃和非活跃内存;


-f:显示从系统启动至今的fork数量;


-s:显示内存相关统计信息及多种系统活动数量;


-d:显示磁盘相关统计信息;


-p:显示指定磁盘分区统计信息;


统计信息


vmstat 3 5即每隔3秒统计一次共统计5次,其统计信息如下:


r b swpd free buff cache si so bi bo in cs us sy id wa st


字段说明:


procs(进程):


r:表示运行队列(就是说多少个进程真的分配到CPU),一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。


b:等待IO的进程数量,即阻塞的进程量。


memory(内存):


swpd:虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。


free:空闲物理内存大小;


buff:系统用作缓冲的内存大小,如目录里面有什么内容,权限等的缓存。


cache:用作缓存的内存大小,直接用来记忆我们打开的文件,给文件做缓冲。


inact:非活跃内存大小(当使用-a选项时显示)


active:活跃的内存大小(当使用-a选项时显示)


swap:


si:每秒从交换区写入内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。


so: 每秒从内存写出交换区的内存大小,若这个值大于0同上。


io:


bi:每秒读取的块数,默认块大小是1024byte;


bo:每秒写入的块数;


system:


in:每秒CPU中断数,包括时间中断。


cs:每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。


cpu(以百分比表示):


us:用户进程执行时间(user time);


sy:系统进程执行时间(system time),如果太高,表示系统调用时间长,例如是IO操作频繁。


id:空闲时间(包括IO等待时间),中央处理器的空闲时间,以百分比表示,一般来说,id + us + sy = 100。


wa:等待IO时间;


IOSTAT
iostat工具将对系统的磁盘操作活动进行监视。它的特点是汇报磁盘活动统计情况,同时也会汇报出CPU使用情况。同vmstat一样,iostat也有一个弱点,就是它不能对某个进程进行深入分析,仅对系统的整体情况进行分析。iostat首次运行时显示自系统启动开始的各项统计信息,之后运行iostat将显示自上次运行该命令以后的统计信息。


命令参数


-c:仅显示CPU统计信息,与-d互斥;


-d:仅显示磁盘统计信息,与-c互斥;


-k|-m:以kb/s或mb/s显示;


-x:输出拓展统计信息;


-p:显示磁盘和分区信息,与-x互斥,也可以-p后指定设备名;


-t:输出信息收集时刻的时间;


统计信息


iostat 2 3


输出两块信息,CPU信息和磁盘信息。


CPU信息字段:


avg-cpu: %user %nice %system %iowait %steal %idle


cpu属性值说明:


%user:用户进程消耗CPU比例;


%nice:用户进程优先级调整消耗CPU比例;


%system:系统内核消耗CPU比例;


%iowait:等待磁盘IO消耗CPU比例;


%steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。


%idle:CPU空闲时间比例(不包括等待磁盘IO的时间);


备注:如果%iowait的值过高,表示硬盘存在I/O瓶颈,%idle值高,表示CPU较空闲,如果%idle值高但系统响应慢时,有可能是CPU等待分配内存,此时应加大内存容量。%idle值如果持续低于10,那么系统的CPU处理能力相对较低,表明系统中最需要解决的资源是CPU。


磁盘信息字段:


Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn


磁盘属性值说明:


Device:设备名称;


Tps:设备上每秒的io传输(可能多个io被组成一个io)的次数;


Blk_read/s:每秒从设备读取的数量;


Blk_wrtn/s:每秒写到设备的数量;


Blk_read:间隔时间内,从设备读取总的block数量;


Blk_wrtn:间隔时间内,写到设备总的block数量;


注:激活-k|-m选项,将变成kb_*或者MB_*


-x拓展字段说明:


Device: rrqm/s wrqm/s r/s w/s rsec/s wsec/s rkB/s wkB/s avgrq-sz avgqu-sz await svctm %util


rrqm/s:每秒进行merge(多个io的合并)读操作的数量;


wrqm/s:每秒进行merge(多个io的合并)写操作的数量;


r/s:每秒完成读io设备的次数;


w/s:每秒完成写io设备的次数;


rsec/s:每秒读扇区的次数;


wsec/s:每秒写扇区的次数,注:激活-k|-m 将变成rkb/s wkb/s | rmb/s wmb/s;


avgrq-sz:平均每次io设备的大小(以扇区为单位),因为有merge读或写,所以每次io大小需要计算;


avgqu-sz:平均I/O队列长度,队列长度越短越好;


await:每一个IO请求的处理的平均时间(单位是微秒毫秒)。这里可以理解为IO的响应时间或等待时间,一般地系统IO响应时间应该低于5ms,如果大于10ms就比较大了。这个时间包括了队列时间和服务时间,也就是说,一般情况下,await大于svctm,它们的差值越小,则说明队列时间越短,反之差值越大,队列时间越长,说明系统出了问题。


svctm:表示平均每次设备I/O操作的服务时间(以毫秒为单位)。如果svctm的值与await很接近,表示几乎没有I/O等待,磁盘性能很好,如果await的值远高于svctm的值,则表示I/O队列等待太长,系统上运行的应用程序将变慢。


%util:在统计时间内所有处理IO时间,除以总共统计时间。例如,如果统计间隔1秒,该设备有0.8秒在处理IO,而0.2秒闲置,那么该设备的%util = 0.8/1 = 80%,所以该参数暗示了设备的繁忙程度。一般地,如果该参数是100%表示设备已经接近满负荷运行了(当然如果是多磁盘,即使%util是100%,因为磁盘的并发能力,所以磁盘使用未必就到了瓶颈)。


常见用法


iostat -d -k 1 10                  #查看TPS和吞吐量信息


iostat -d -x -k 1 10             #查看设备使用率(%util)、响应时间(await)


iostat -c 1 10                      #查看cpu状态


FREE
free主要用来查看Linux系统内存状态情况,同样top和vmstat也可用来查看内存状态信息。


命令参数


-b 以Byte为单位显示内存使用情况。


-k 以KB为单位显示内存使用情况。


-m 以MB为单位显示内存使用情况。


-o 不显示缓冲区调节列。


-s<间隔秒数> 持续观察内存使用状况。


-t 显示内存总和列。


直接数字也可控制显示次数。


统计信息


统计信息如:


linux-free


Mem行数据说明:物理内存总量、物理内存已使用量(含缓冲和缓存)、物理内存空闲量、共享内存量、缓冲区内存占用量、缓存区内存占用量。


-/+ buffers/cache行数据说明:实际内存使用量(已使用内存减缓冲和缓存占用内存)、实际空闲内存量(空闲内存加buffers和cached)。


Swap行数据说明:交换内存(虚拟内存)总量、交换内存使用量、交换内存空闲量。


buffers和cached区别


buffer用于存入要写入disk(硬盘)的数据,而cache用于存放从disk上读出的数据。这两种机制有助于提升OS的IO性能,buffer让数据达到某个临界点才写入disk,减少了写入频次;cache将从disk中读取的数据缓存起来,这样当系统下次使用时就避免了从disk再次读出,减少了读取频次。之所有有实际内存量,是因为从应用程序角度看buffer和cache都属于可用内存。当应用程序需要时,两者都会很快的被回收。


为了提高磁盘存取效率,Linux做了一些精心的设计,除了对dentry进行缓存(用于VFS,加速文件路径名到inode的转换),还采取了两种主要Cache方式:Buffer Cache和Page Cache。前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache有效缩短了I/O系统调用(比如read,write,getdents)的时间。


磁盘的操作有逻辑级(文件系统)和物理级(磁盘块),这两种Cache就是分别缓存逻辑和物理级数据的。Page cache实际上是针对文件系统的,是文件的缓存,在文件层面上的数据会缓存到page cache。文件的逻辑层需要映射到实际的物理磁盘,这种映射关系由文件系统来完成。当page cache的数据需要刷新时,page cache中的数据交给buffer cache,因为Buffer Cache就是缓存磁盘块的。但是这种处理在2.6版本的内核之后就变的很简单了,没有真正意义上的cache操作。Buffer cache是针对磁盘块的缓存,也就是在没有文件系统的情况下,直接对磁盘进行操作的数据会缓存到buffer cache中。例如,文件系统的元数据都会缓存到buffer cache中。


简单说来,page cache用来缓存文件数据,buffer cache用来缓存磁盘数据。在有文件系统的情况下,对文件操作,那么数据会缓存到page cache,如果直接采用dd等工具对磁盘进行读写,那么数据会缓存到buffer cache。

你可能感兴趣的:(OS_Linux)