linux命令vmstat、iostat、inotifywait

2018-07-06 18:31:19

vmstat 可以打印出进程,内存,页,块io,磁盘,cpu等使用情况,第一次显示的信息是从开机到现在的平均值,后面则是当前的平均使用情况。

-S    后面可以接单位,例如 K/M显示内存

-a    inactive - 长时间未访问,如果需要可以立即回收
      active - 最近访问过的页面,不能很快被回收
      使用 inac/active 来取代 buffer/cache 的内存输出信息

-f    开机到目前为止,系统fork的程序数
-s    将一些事件开机至目前为止,导致的内存变化情况列表说明
-d    列出磁盘的读写总量统计表
-p    后面列出分区,可显示该分区的读写总量统计表
#显示一次,开机到现在的平均使用情况
[freecls@izj6cfw9yi1iqoik31tqbgz ~]$ vmstat
procs -----------memory---------- ---swap-- -----io---- -system-- ------cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 3  0      0  65564 365148 335876    0    0     5     7   14   17  0  0 100  0  0
#2秒1次,显示5次,以内存以MB单位显示
vmstat 2 5 -S M

#两秒显示一次
vmstat 2

字段说明,读者可以参考 linux命令-top 获取相关的额外解释。

r      运行队列中进程的数量,长期大于1证明cpu不够
b      等待io的进程数量

swpd   交换的内存数量,大于0但是si,so长期为0
       代表之前某段时间内存不足,现在不影响
free   空闲的内存
buff   内存缓冲区
cache  内存缓存

#如果不为0,代表目前内存不足
si    swap in 磁盘交换进内存
so    swap out 内存交换出磁盘

#磁盘io情况
bi    block in  每秒从磁盘读取的块数到内存
bo    block out 每秒从内存写入到磁盘的块数

#这两个数越大,代表系统cpu越繁忙
in    每秒中断数,包括时钟中断
cs    每秒上下文切换数

us    用户cpu
sy    内核cpu
id    空闲cpu

wa    io等待时间

st    Steal Time(与其他虚拟机竞争cpu)

有时候我们在测试的时候在连续的读写文件,但是bi,bo为0,那是因为缓冲区的原因,内核为了性能考虑,当要有数据写入到磁盘的时候,先不写入,等到合适的时机才会写入到磁盘。

从磁盘读取数据也一样,比如我们调用了10次 read() 操作,可能只有1次从磁盘读取到内存的操作,其他9次只是在内存里复制数据,因为内核为了性能考虑,会一次性读取大于所请求的字节数到内存缓存,那么下次连续的读取就可以直接从内存拿。


iostat 也可以用来统计cpu以及输入输出统计,不过在磁盘监控方面功能更加强大,可以细化到特定的磁盘。

#证明没安装
-bash: iostat: command not found
yum install sysstat
#默认单位为块(block)
-k    单位K
-m    单位M

-p    监控特定磁盘

-c    仅显示 CPU 的状态
-d    仅显示储存设备的状态,不可与 -c 一起用

-t    显示日期出来
-x    详细信息
-N    LVM
#2秒显示一次
[root@192 ~]# iostat 2
Linux 3.10.0-514.el7.x86_64 (192.168.1.10) 	07/06/2018 	_x86_64_	(2 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.03    0.00    0.09    0.05    0.00   99.84

Device:            tps    kB_read/s    kB_wrtn/s    kB_read    kB_wrtn
sdb               0.00         0.03         0.00       2647          0
sda               1.01        12.94       215.27     986140   16403137
#2s一次,只监控磁盘,单位M
iostat -dm 2

#2s一次,只监控sda磁盘,单位M
iostat -dm -p sda 2
#显示详细信息
[root@192 ~]# iostat -dmx 2
Linux 3.10.0-514.el7.x86_64 (192.168.1.10) 	07/06/2018 	_x86_64_	(2 CPU)

Device:  rrqm/s   wrqm/s     r/s     w/s    rMB/s    wMB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdb      0.00     0.00    0.00    0.00     0.00     0.00    15.95     0.00    1.69    1.69    0.00   1.39   0.00
sda      0.02     0.38    0.45    0.56     0.01     0.21   450.99     0.03   27.42    4.58   45.78   1.10   0.11

参数解释

rrqm/s:     加入到设备队列的每秒merged读请求书。
wrqm/s:     加入到设备队列的每秒merged写请求数。

r/s:        merge后,每秒完成的读请求数
w/s:        merge后,每秒完成的写请求数

rkB/s:       每秒读数量(单位可以自己指定)。
wkB/s:       每秒写数量(单位可以自己指定)

avgrq-sz:    对设备请求的平均大小(扇区)
avgqu-sz:    对设备请求的平均队列长度

await:       对设备请求的io等待时间(毫秒)
r_await:     对设备读请求的io等待时间(毫秒)
w_await:     对设备写请求的io等待时间(毫秒)

svctm:       对设备的平均服务时间(毫秒)-后期会移除,不太可靠
%util:       对io设备的请求百分比时间流逝。

rrqm/s 和 r/s 以及 wrqm/s 和 w/s是对应的,前者大于后者证明io比较忙碌。

如果 %util 接近 100%,说明产生的I/O请求太多,I/O系统已经接近饱和,该磁盘可能存在瓶颈。

如果 avgqu-sz 比较大,也表示有相当多的io在等待。


inotifywait 命令可以用来监控文件或者目录下的文件变动。

#证明没安装
-bash: inotifywait: command not found
yum install inotify-tools
-m, --monitor  		是要持续监视变化。 
-r    使用递归形式监视目录。 
-q    减少冗余信息,只打印出需要的信息。 
-e    指定要监视的事件列表。 

--timefmt    是指定时间的输出格式。 
--format     指定文件变化的详细信息。

access    访问,读取文件。 
modify	  修改,文件内容被修改。 
attrib	  属性,文件元数据被修改。 
move	  移动,对文件进行移动操作。 
create	  创建,生成新文件 
open	  打开,对文件进行打开操作。 
close	  关闭,对文件进行关闭操作。 
delete	  删除,文件被删除。

close_write, close_nowrite, unmount

#监视文件
[root@192 ~]# inotifywait -m tmp.txt
Setting up watches.
Watches established.

tmp.txt OPEN 
tmp.txt MODIFY 
tmp.txt CLOSE_WRITE,CLOSE
#递归监视目录下所有文件
inotifywait -mqr /var/log/
#递归监控当前目录下 创建文件事件
inotifywait -mr -e create ./


备注:
1.本系列命令都在centos7里测试,其他发行版如ubuntu、debian、fedora、opensuse等可能略微不同
2.本文只讲解常用用法,详细用法请自行利用 man 命令查看
3.原文地址http://www.freecls.com/a/2712/8c

 

©著作权归作者所有
收藏
推荐阅读
简介
天降大任于斯人也,必先苦其心志。