linux系统监控命令

一、top

1.1命令简介

top命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况,类似于Windows的任务管理器。top是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户终止该程序为止.比较准确的说,top命令提供了实时的对系统处理器的状态监视.它将显示系统中CPU最“敏感”的任务列表.该命令可以按CPU使用.内存使用和执行时间对任务进行排序;而且该命令的很多特性都可以通过交互式命令或者在个人定制文件中进行设定。

1.2top图文详解


上图所示

第一行

系统时间;系统启动经历时间;当前在线的用户;一分钟;五分钟;15分钟的平均负载

第二行

系统任务总量;运行的任务;睡眠的任务;停止的任务;僵尸任务

第三行

用户态进程占用CPU时间百分比,不包含renice值为负的任务占用的CPU的时间;内核占用cpu的百分比;改变过优先级的进程占用cpu的百分比;空闲cpu时间百分比;等待I/O的cpu时间百分比;cpu硬中断时间百分比;cpu软终端时间百分比
注:这里显示数据是所有cpu的平均值,如果想看每一个cpu的处理情况,按1即可;折叠,再次按1。

第四行

物理内存总量;已使用的物理内存;空闲的物理内存;用于工作内核缓存的物理内存

第五行

swap总量;已经使用的;空闲的;缓冲交换区的swap使用量

剩余行的进程信息

PID:进程pid
USER:执行进程的用户
PR:优先级,越小优先级越高
NI: nice值
VIRT:进程占用的虚拟内存
RES: 进程占用的物理内存
SHR:进程使用的共享内存
S:进程的状态。S表示休眠,R表示正在运行,Z表示僵死状态,N表示该进程优先值为负数
%CPU:该进程占用cpu的使用率
%MEM:该进程占用的物理内存和总内存的百分比
TIME+:该进程启动后占用的总的cpu时间,即占用cpu时间的累加值
COMMAND:进程启动的命令名称
下面列出一些常用的 top命令操作指令

  1. q:退出top命令
  2. <Space>:立即刷新
  3. s:设置刷新时间间隔
  4. c:显示命令完全模式
  5. t::显示或隐藏进程和CPU状态信息
  6. m:显示或隐藏内存状态信息
  7. l:显示或隐藏uptime信息
  8. f:增加或减少进程显示标志
  9. S:累计模式,会把已完成或退出的子进程占用的CPU时间累计到父进程的MITE+
  10. P:按%CPU使用率排行
  11. T:按MITE+排行
  12. M:按%MEM排行
  13. u:指定显示用户进程
  14. r:修改进程renice
  15. kkill:进程
  16. i:只显示正在运行的进程
  17. W:保存对top的设置到文件~/.toprc,下次启动将自动调用toprc文件的设置。
  18. h:帮助命令。
  19. q:退出

二、free

2.1 命令简介

将used的值减去 buffer和cache的值就是你当前真实内存使用 ————– 对操作系统来讲是Mem的参数.buffers/cached 都是属于被使用,所以它认为free只有16936.
应用程序来讲是(-/+ buffers/cach).buffers/cached 是等同可用的,因为buffer/cached是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。 所以,以应用来看看,以(-/+ buffers/cache)的free和used为主.所以我们看这个就好了.另外告诉大家 一些常识.Linux为了提高磁盘和内存存取效率, Linux做了很多精心的设计, 除了对dentry进行缓存(用于 VFS,加速文件路径名到inode的转换), 还采取了两种主要Cache方式:Buffer Cache和Page Cache。 前者针对磁盘块的读写,后者针对文件inode的读写。这些Cache能有效缩短了 I/O系统调用(比如read,write,getdents)的时间。 记住内存是拿来用的,不是拿来看的.不象windows,无论你的真实物理内存有多少,他都要拿硬盘交换 文件来读.这也就是windows为什么常常提示虚拟空间不足的原因.你们想想,多无聊,在内存还有大部分 的时候,拿出一部分硬盘空间来充当内存.硬盘怎么会快过内存.所以我们看linux,只要不用swap的交换 空间,就不用担心自己的内存太少.如果常常swap用很多,可能你就要考虑加物理内存了.这也是linux看 内存是否够用的标准哦.

2.2 free命令的语法格式和参数

语  法: free [-bkmotV][-s <间隔秒数>]
补充说明:free指令会显示内存的使用情况,包括实体内存,虚拟的交换文件内存,共享内存区段,以及系统核心使用的缓冲区等。
参  数:
-b  以Byte为单位显示内存使用情况。
-k  以KB为单位显示内存使用情况。
-m  以MB为单位显示内存使用情况。(最常用)
-o  不显示缓冲区调节列。
-s<间隔秒数>  持续观察内存使用状况。
-t  显示内存总和列。
-V  显示版本信息

2.3 详解free命令

  1. [root@iZ28t900vpcZ ~]# free -m
  2. total used free shared buffers cached
  3. Mem: 488 439 49 50 57 80
  4. -/+ buffers/cache: 300 188
  5. Swap: 0 0 0

2.3.1 Mem表示物理内存统计

total:表示物理内存总量(total = used + free)
used:表示总计分配给缓存(包含buffers 与cache )使用的数量,但其中可能部分缓存并未实际使用。
free:未被分配的内存。
shared:共享内存,一般系统不会用到,这里也不讨论。
buffers:系统分配但未被使用的buffers 数量。
cached:系统分配但未被使用的cache 数量。

2.3.2 -/+ buffers/cache表示物理内存的缓存统计

used2:used1 – buffers1-cached1 (439-57-80)也是实际使用的内存总量。
free2= buffers1 + cached1 + free1 (49+57+80)未被使用的buffers 与cache 和未被分配的内存之和,这就是系统当前实际可用内存

2.3.3 Swap

表示硬盘上交换分区的使用情况

  1. [root@iZ28t900vpcZ ~]# cat /proc/meminfo |grep -i swap
  2. SwapCached: 0 kB
  3. SwapTotal: 0 kB
  4. SwapFree: 0 kB

交换将通过三个途径来减少系统中使用的物理页面的个数:
1.减少缓冲与页面cache的大小,
2.将系统V类型的内存页面交换出去,
3.换出或者丢弃页面。(Application 占用的内存页,也就是物理内存不足)。
事实上,少量地使用swap是不是影响到系统性能的。

2.4 buffers与cached的区别

对于应用程序来说,buffers/cached 是等于可用的,因为buffer/cached是为了提高文件读取的性能,当应用程序需在用到内存的时候,buffer/cached会很快地被回收。
所以从应用程序的角度来说 可用内存=系统free memory+buffers+cached(和上文命令解释相符).
buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached是用来给文件做缓冲。
那就是说:buffers是用来存储,目录里面有什么内容,权限等等。

三、vmstat

3.1命令简介

vmstat是一个很全面的性能分析工具,可以观察到系统的进程状态、内存使用、虚拟内存使用、磁盘的IO、中断、上下文切换、CPU使用等。对于 Linux 的性能分析,100%理解 vmstat 输出内容的含义,并能灵活应用,那对系统性能分析的能力就算是基本掌握了。

3.2使用vmstat

  1. [root@iZ28t900vpcZ ~]# vmstat 2 3 (每两秒分析一次,总共分析三次)
  2. procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
  3. r b swpd free buff cache si so bi bo in cs us sy id wa st
  4. 0 0 0 50296 60296 82504 0 0 3 3 1 14 0 0 99 0 0
  5. 0 0 0 50288 60296 82504 0 0 0 0 86 232 0 0 100 0 1
  6. 0 0 0 50288 60296 82504 0 0 0 0 81 222 0 0 100 0 0

详解vmstat命令的各个域

r 表示运行队列(就是说多少个进程真的分配到CPU),我测试的服务器目前CPU比较空闲,没什么程序在跑,当这个值超过了CPU数目,就会出现CPU瓶颈了。这个也和top的负载有关系,一般负载超过了3就比较高,超过了5就高,超过了10就不正常了,服务器的状态很危险。top的负载类似每秒的运行队列。如果运行队列过大,表示你的CPU很繁忙,一般会造成CPU使用率很高。
b 表示阻塞的进程,这个不多说,进程阻塞,大家懂的。
swpd 虚拟内存已使用的大小,如果大于0,表示你的机器物理内存不足了,如果不是程序内存泄露的原因,那么你该升级内存了或者把耗内存的任务迁移到其他机器。
free 空闲的物理内存的大小,我的机器内存总共8G,剩余3415M。
buff Linux/Unix系统是用来存储,目录里面有什么内容,权限等的缓存,我本机大概占用300多M
cache cache直接用来记忆我们打开的文件,给文件做缓冲,我本机大概占用300多M(这里是Linux/Unix的聪明之处,把空闲的物理内存的一部分拿来做文件和目录的缓存,是为了提高 程序执行的性能,当程序使用内存时,buffer/cached会很快地被使用。)
si 每秒从磁盘读入虚拟内存的大小,如果这个值大于0,表示物理内存不够用或者内存泄露了,要查找耗内存进程解决掉。我的机器内存充裕,一切正常。
so 每秒虚拟内存写入磁盘的大小,如果这个值大于0,同上。
bi 块设备每秒接收的块数量,这里的块设备是指系统上所有的磁盘和其他块设备,默认块大小是1024byte,我本机上没什么IO操作,所以一直是0,但是我曾在处理拷贝大量数据(2-3T)的机器上看过可以达到140000/s,磁盘写入速度差不多140M每秒
bo 块设备每秒发送的块数量,例如我们读取文件,bo就要大于0。bi和bo一般都要接近0,不然就是IO过于频繁,需要调整。
in 每秒CPU的中断次数,包括时间中断
cs 每秒上下文切换次数,例如我们调用系统函数,就要进行上下文切换,线程的切换,也要进程上下文切换,这个值要越小越好,太大了,要考虑调低线程或者进程的数目,例如在apache和nginx这种web服务器中,我们一般做性能测试时会进行几千并发甚至几万并发的测试,选择web服务器的进程可以由进程或者线程的峰值一直下调,压测,直到cs到一个比较小的值,这个进程和线程数就是比较合适的值了。系统调用也是,每次调用系统函数,我们的代码就会进入内核空间,导致上下文切换,这个是很耗资源,也要尽量避免频繁调用系统函数。上下文切换次数过多表示你的CPU大部分浪费在上下文切换,导致CPU干正经事的时间少了,CPU没有充分利用,是不可取的。
us 用户CPU时间,我曾经在一个做加密解密很频繁的服务器上,可以看到us接近100,r运行队列达到80(机器在做压力测试,性能表现不佳)。
sy 系统CPU时间,如果太高,表示系统调用时间长,例如是IO操作频繁。
id 空闲 CPU时间,一般来说,id + us + sy = 100,一般我认为id是空闲CPU使用率,us是用户CPU使用率,sy是系统CPU使用率。
wt 等待IO CPU时间。

四、iostat

4.1 命令简介

通过观察设备的活跃时间和他们平均传输率之间的关系来监视系统的输入/输出设备负载。iostat生成的报告可以用于修改系统配置从而更好在物理硬盘间平衡输入/输出的报告。

4.2 常用参数

-c 显示cpu负载报告
-d 显示设备负载报告
-k 以KB的方式显示
-m 以MB的方式显示
-x 显示详细信息

4.3 用法举例

iostat -d 2 6 #每2秒查看一次,一共查看6次
iostat -x sda sdb 2 6 #每2秒查看一次,一共查看6次

4.4 命令详解

4.4.1 iostat -d -k 1 10

  1. [root@iZ28t900vpcZ ~]# iostat -d -k 1 10
  2. Linux 3.10.0-123.9.3.el7.x86_64 (iZ28t900vpcZ) 03/03/2016 _x86_64_ (1 CPU)
  3. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
  4. xvda 0.36 2.91 3.07 9261261 9750536
  5. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
  6. xvda 0.00 0.00 0.00 0 0
  7. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
  8. xvda 0.00 0.00 0.00 0 0
  9. Device: tps kB_read/s kB_wrtn/s kB_read kB_wrtn
  10. xvda 0.00 0.00 0.00 0 0

tps:该设备每秒的传输次数(Indicate the number of transfers per second that were issued to the device.)。“一次传输”意思是“一次I/O请求”。多个逻辑请求可能会被合并为“一次I/O请求”。“一次传输”请求的大小是未知的。
kB_read/s:每秒从设备(drive expressed)读取的数据量;
kB_wrtn/s:每秒向设备(drive expressed)写入的数据量;
kB_read:读取的总数据量;
kB_wrtn:写入的总数量数据量;这些单位都为Kilobytes。

4.4.2 iostat -d -x -k 1 10

  1. [root@iZ28t900vpcZ ~]# iostat -d -x -k 1 10
  2. Linux 3.10.0-123.9.3.el7.x86_64 (iZ28t900vpcZ) 03/03/2016 _x86_64_ (1 CPU)
  3. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
  4. xvda 0.00 0.17 0.12 0.24 2.91 3.07 33.17 0.00 7.72 4.34 9.37 1.42 0.05
  5. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
  6. xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  7. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
  8. xvda 0.00 12.00 0.00 3.00 0.00 60.00 40.00 0.01 2.33 0.00 2.33 1.33 0.40
  9. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
  10. xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00
  11. Device: rrqm/s wrqm/s r/s w/s rkB/s wkB/s avgrq-sz avgqu-sz await r_await w_await svctm %util
  12. xvda 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00

rrqm/s: 每秒进行 merge 的读操作数目.即 delta(rmerge)/s
wrqm/s: 每秒进行 merge 的写操作数目.即 delta(wmerge)/s
r/s: 每秒完成的读 I/O 设备次数.即 delta(rio)/s
w/s: 每秒完成的写 I/O 设备次数.即 delta(wio)/s
rsec/s: 每秒读扇区数.即 delta(rsect)/s
wsec/s: 每秒写扇区数.即 delta(wsect)/s
rkB/s: 每秒读K字节数.是 rsect/s 的一半,因为每扇区大小为512字节.(需要计算)
wkB/s: 每秒写K字节数.是 wsect/s 的一半.(需要计算)
avgrq-sz: 平均每次设备I/O操作的数据大小 (扇区).delta(rsect+wsect)/delta(rio+wio)
avgqu-sz: 平均I/O队列长度.即 delta(aveq)/s/1000 (因为aveq的单位为毫秒).
await: 平均每次设备I/O操作的等待时间 (毫秒).即 delta(ruse+wuse)/delta(rio+wio)
svctm: 平均每次设备I/O操作的服务时间 (毫秒).即 delta(use)/delta(rio+wio)
%util: 一秒中有百分之多少的时间用于 I/O 操作,或者说一秒中有多少时间 I/O 队列是非空的.即 delta(use)/s/1000 (因为use的单位为毫秒)
:1)如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经满负荷,该磁盘可能存在瓶颈.
2)idle小于70% IO压力就较大了,一般读取速度有较多的wait.
同时可以结合vmstat 查看查看b参数(等待资源的进程数)和wa参数(IO等待所占用的CPU时间的百分比,高过30%时IO压力高)
另外 await 的参数也要多和 svctm 来参考.差的过高就一定有 IO 的问题.
3)avgqu-sz 也是个做 IO 调优时需要注意的地方,这个就是直接每次操作的数据的大小,如果次数多,但数据拿的小的话,其实 IO 也会很小.如果数据拿的大,才IO 的数据会高.也可以通过 avgqu-sz × ( r/s or w/s ) = rsec/s or wsec/s.也就是讲,读定速度是这个来决定的.

4.4.3 iostat -c 1 10

  1. [root@iZ28t900vpcZ ~]# iostat -c 1 10
  2. Linux 3.10.0-123.9.3.el7.x86_64 (iZ28t900vpcZ) 03/03/2016 _x86_64_ (1 CPU)
  3. avg-cpu: %user %nice %system %iowait %steal %idle
  4. 0.45 0.00 0.13 0.04 0.10 99.28
  5. avg-cpu: %user %nice %system %iowait %steal %idle
  6. 0.00 0.00 0.00 0.00 0.00 100.00
  7. avg-cpu: %user %nice %system %iowait %steal %idle
  8. 0.00 0.00 0.00 0.00 0.00 100.00
  9. avg-cpu: %user %nice %system %iowait %steal %idle
  10. 1.00 0.00 0.00 0.00 0.00 99.00
  11. avg-cpu: %user %nice %system %iowait %steal %idle
  12. 0.00 0.00 0.00 0.00 0.00 100.00

%user CPU处在用户模式下的时间百分比。
%niceCPU处在带NICE值的用户模式下的时间百分比。
%system CPU处在系统模式下的时间百分比。
%iowait CPU等待输入输出完成时间的百分比。
%steal 管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。
%idleCPU空闲时间百分比。

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

4.5 举例说明IO

举一个例子,我们在超市排队 checkout 时,怎么决定该去哪个交款台呢? 首当是看排的队人数,5个人总比20人要快吧? 除了数人头,我们也常常看看前面人购买的东西多少,如果前面有个采购了一星期食品的大妈,那么可以考虑换个队排了.还有就是收银员的速度了,如果碰上了连 钱都点不清楚的新手,那就有的等了.另外,时机也很重要,可能 5 分钟前还人满为患的收款台,现在已是人去楼空,这时候交款可是很爽啊,当然,前提是那过去的 5 分钟里所做的事情比排队要有意义 (不过我还没发现什么事情比排队还无聊的).
I/O 系统也和超市排队有很多类似之处
1)r/s+w/s 类似于交款人的总数
2)平均队列长度(avgqu-sz)类似于单位时间里平均排队人的个数
3)平均服务时间(svctm)类似于收银员的收款速度
4)平均等待时间(await)类似于平均每人的等待时间
5)平均I/O数据(avgrq-sz)类似于平均每人所买的东西多少
6)I/O 操作率 (%util)类似于收款台前有人排队的时间比例.
我们可以根据这些数据分析出 I/O 请求的模式,以及 I/O 的速度和响应时间.

0
未经许可,不得转载,否则将受到作者追究,博主联系方式见首页右上角

该文章由 发布

这货来去如风,什么鬼都没留下!!!
发表我的评论
取消评论
代码 贴图 加粗 链接 删除线 签到