概述

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux系统

Linux-使用vmstat和iostat/iotop命令进行Linux性能监控

vmstat和iostat两个命令都适用于所有主要的类unix系统(Linux/unix/FreeBSD/Solaris)。

磁盘IO是服务器性能的一个重要指标,下面介绍两个常用的观察IO的命令,iostat我一般用来查看磁盘的IO,以及在测试磁盘时做一个监控工具,iotop在排查服务器问题时,可以用来找到某些异常程序!下面都会做一个简要的介绍!

博文中使用的操作系统为:

[xgj@entel2 ~]$ cat /etc/redhat-release 
CentOS release 6.5 (Final)
[xgj@entel2 ~]$ 
在Linux系统中安装sysstat

如果vmstat和iostat命令在你的系统中不可用,请安装sysstat软件包。vmstat,sar和iostat命令都包含在sysstat(系统监控工具)软件包中。iostat命令生成CPU和所有设备的统计信息。你可以从http://sebastien.godard.pagesperso-orange.fr/download.html下载源代码包编译安装sysstat,但是我们建议通过YUM命令进行安装。

#yum -y install sysstat
  • vmstat - 内存,进程和分页等的简要信息。
  • iostat - CPU统计信息,设备和分区的输入/输出统计信息。

Linux下vmstat命令的6个范例

1. 列出活动和非活动的内存

如下范例中输出6列。vmstat的man页面中解析的每一列的意义。最重要的是内存中的free属性和交换分区中的si和so属性。

[xgj@entel2 ~]$ vmstat  -a
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free  inact active   si   so    bi    bo   in   cs us sy id wa st
 1  1 5560648 432300 60687632 69192544    0    0    16    24    0    0  1  1 98  1  0   
[xgj@entel2 ~]$ 
  • Free – 空闲的内存空间
  • si – 每秒从磁盘中交换进内存的数据量(以KB为单位)。
  • so – 每秒从内存中交换出磁盘的数据量(以KB为单位)。

注意:如果你不带参数的执行vmstat命令,它会输出自系统启动以来的总结报告。


2. 每X秒执行vmstat,共执行N次

下面命令将会每2秒中执行一次vmstat,执行6次后自动停止执行。

[xgj@entel2 ~]$ vmstat 2 6
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  1 5596576 396640 1747456 113387648    0    0    16    24    0    0  1  1 98  1  0   
 0  1 5598864 385620 1747464 113398368    0 1144 10956 11130 13465 24846  1  1 94  4  0 
 0  1 5599376 412456 1747480 113369968    0  256  9040  8690 13822 24798  1  1 94  4  0 
 0  1 5599772 422664 1747480 113359576    0  198 10252  9540 13831 24521  1  1 94  4  0 
 1  0 5599772 386808 1747504 113400336    0    0 10760  9584 13634 24454  1  1 94  4  0 
 0  1 5599976 377404 1747504 113408784    0  102 10252  9982 13895 24758  2  1 94  4  0 
[xgj@entel2 ~]$ 

3. 带时间戳的vmstat命令

带-t参数执行vmstat命令,该命令将会在每一行输出后都带一个时间戳,如下所示。

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux教程_02

[xgj@entel2 ~]$ vmstat -t  1 3
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu------ ---timestamp---
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 2  0 5606336 441880 1747820 113351312    0    0    16    24    0    0  1  1 98  1  0   2017-01-19 19:37:01 BOT
 2  1 5606336 420764 1747820 113373088    0    0 11144 10248 13626 24692  1  1 94  4  0 2017-01-19 19:37:02 BOT
 1  1 5606332 394668 1747836 113394960   32    0 11700 10752 14271 25457  2  1 93  4  0 2017-01-19 19:37:03 BOT
[xgj@entel2 ~]$ 

4. 统计各种计数器

vmstat命令的-s参数,将输出各种事件计数器和内存的统计信息。

[xgj@entel2 ~]$ vmstat -s
    132223776  total memory
    131831080  used memory
     69132688  active memory
     60717320  inactive memory
       392696  free memory
      1748412  buffer memory
    113362880  swap cache
     16777212  total swap
      5624704  used swap
     11152508  free swap
    124326607 non-nice user cpu ticks
        11823 nice user cpu ticks
     94812107 system cpu ticks
  17320027017 idle cpu ticks
    127489886 IO-wait cpu ticks
          327 IRQ cpu ticks
      1298224 softirq cpu ticks
            0 stolen cpu ticks
   2848730960 pages paged in
   4254100177 pages paged out
       287406 pages swapped in
      1893055 pages swapped out
   3780708913 interrupts
    737819991 CPU context switches
   1477424738 boot time
     51132198 forks
[xgj@entel2 ~]$ 

5. 磁盘统计信息

vmstat的-d参数将会输出所有磁盘的统计信息。

[xgj@entel2 ~]$ vmstat -d
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
ram0       0      0       0       0      0      0       0       0      0      0
ram1       0      0       0       0      0      0       0       0      0      0
ram2       0      0       0       0      0      0       0       0      0      0
ram3       0      0       0       0      0      0       0       0      0      0
ram4       0      0       0       0      0      0       0       0      0      0
ram5       0      0       0       0      0      0       0       0      0      0
ram6       0      0       0       0      0      0       0       0      0      0
ram7       0      0       0       0      0      0       0       0      0      0
ram8       0      0       0       0      0      0       0       0      0      0
ram9       0      0       0       0      0      0       0       0      0      0
ram10      0      0       0       0      0      0       0       0      0      0
ram11      0      0       0       0      0      0       0       0      0      0
ram12      0      0       0       0      0      0       0       0      0      0
ram13      0      0       0       0      0      0       0       0      0      0
ram14      0      0       0       0      0      0       0       0      0      0
ram15      0      0       0       0      0      0       0       0      0      0
loop0      0      0       0       0      0      0       0       0      0      0
loop1      0      0       0       0      0      0       0       0      0      0
loop2      0      0       0       0      0      0       0       0      0      0
loop3      0      0       0       0      0      0       0       0      0      0
loop4      0      0       0       0      0      0       0       0      0      0
loop5      0      0       0       0      0      0       0       0      0      0
loop6      0      0       0       0      0      0       0       0      0      0
loop7      0      0       0       0      0      0       0       0      0      0
sdb   22221426  22382 5487009964 44045589 45506192 152270 4023259784 401825121      0 111140
sda   5793066 784038 211341364 38795413 208224442 81100325 4485833433 1269735263      0 715938
dm-0   31239      0  630834  147239  57173      0 3474960 3407531      0    345
dm-1  288499      0 2307992 2150847 1894999      0 15159944 124189941      0   1598
dm-2   29840      0 1503610  145689 2668937      0 71531824 81253517      0  11178
dm-3    1011      0    8082    1904     69      0     464     685      0      1
dm-4    5306      0   42442    7200 2696005      0 31951584 42201059      0  21685
dm-5    1020      0    8154    2128   1324      0   12168   19261      0      8
dm-6  229541      0 3241218  659663  98793      0  790712 7317801      0    348
dm-7  220706      0 4067906  741873 6904210      0 76988648 149072927      0  42371
dm-8     918      0    7338    1650     30      0     152     275      0      1
disk- ------------reads------------ ------------writes----------- -----IO------
       total merged sectors      ms  total merged sectors      ms    cur    sec
dm-9    6466      0  740538   16764  11926      0   95712  186257      0    109
dm-10 24533644      0 5508246266 59711348 131753441      0 5139101144 3639924222      0 517566
dm-11 3018872      0 173300066 36321168 134949598      0 3174908528 3964229623      0 334654
[xgj@entel2 ~]$ 

6. 以MB为单位输出统计信息

vmstat的-S和-M参数(大写和MB)将会以MB为单位输出。vmstat默认以KB为单位输出统计信息。

[xgj@entel2 ~]$ vmstat -S M 1 5
procs -----------memory---------- ---swap-- -----io---- --system-- -----cpu-----
 r  b   swpd   free   buff  cache   si   so    bi    bo   in   cs us sy id wa st
 1  1   5503    403   1725 110653    0    0    16    24    0    0  1  1 98  1  0    
 2  1   5503    398   1725 110659    0    0  3088  5012 13901 25028  1  1 94  4  0  
 0  1   5503    391   1725 110665    0    0  3600  4800 13976 24952  1  1 94  4  0  
 0  2   5503    385   1725 110672    0    0  3080  4272 13583 24804  1  1 94  4  0  
 0  1   5503    378   1726 110679    0    0  3600  4940 14160 25357  1  0 94  4  0  
[xgj@entel2 ~]$ free -m
             total       used       free     shared    buffers     cached
Mem:        129124     128713        411          0       1728     110639
-/+ buffers/cache:      16345     112779
Swap:        16383       5503      10880
[xgj@entel2 ~]$ 

linux下的iostat命令的6个范例

常用-x和-d选项

iostat是一个统计设备IO和和CPU的工具。最常用的是-x和-d选项

一般我们需要持续观察IO状况:

[xgj@entel2 ~]$  iostat -x 1 2

每1秒钟显示一次报告,显示两次

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux系统_03

man中文手册

1.直接执行iostat不接参数,是指系统从启动到现在为止的统计数据。

2.间隔参数代表每次报告的间隔时间,同样第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。

3.iostat创建3种类型报告,cpu使用率,设备使用率,网络文件系统报告。

4.cpu使用率报告:
(1).%user:用户态所占用的CPU使用率百分比(应用程序)。
(2).%nice:用户态执行nice优先级所占用的CPU使用率百分比。
(3).%system:内核态所占用的CPU使用率百分比(内核)
(4).%iowait:CPU处于idle状态等待磁盘IO请求所占用的百分比。
(5).%steal:当hypervisor服务另一个(虚拟)CPU时,(虚拟)CPU强制等待的时间占比。
(6).%idle:没有磁盘请求时,CPU的空闲时间占比。

5.设备使用率报告:
(1).Device:监测的设备或分区名称
(2).tps:代表每秒的传输数(transfer),传输数可以是单个的IO请求或合并多个逻辑请求到单个IO请求。
(3).Blk_read/s:每秒读取的block数,block相当于扇区的大小,即512字节。旧内核可能不确定。
(4).Blk_wrtn/s:每秒写入的block数。
(5).Blk_read:总读取的block数。
(6).Blk_wrtn:总写入的block数。
(7).kB_read/s kB_wrtn/s kB_read kB_wrtn MB_read/s MB_wrtn/s MB_read MB_wrtn: 同上,只是单位不同
(8).rrqm/s:每秒合并的读请求数。
(9).wrqm/s:每秒合并的写请求数。
(10).r/s:每秒读请求数。
(11).w/s:每秒写请求数。
(12).rsec/s:每秒的读扇区数。
(13).wsec/s:每秒的写扇区数。
(14).rkB/s:每秒读的kB数。
(15).wkB/s:每秒写的kB数。
(16).rMB/s:每秒读的MB数。
(17).wMB/s:每秒写的MB数。
(18).avgrq-sz:平均请求的大小(扇区)。
(19).avgqu-sz:平均队列长度。
(20).await:IO请求发送给设备和设备执行请求的时间(毫秒)。
(21).svctm:设备执行请求的时间(毫秒),此项不准,不可信。
(22).%util:I/O请求发送到设备期间,占用CPU时间的百分比。


监测NFS的统计数据 iostat -n 1

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux系统_04

6.网络文件系统(NFS)报告
显示每个挂载的网络文件系统统计数据
(1).Filesystem:挂载的NFS服务器的主机名和目录
(2).rBlk_nor/s:使用read(2)系统调用接口读取的block数,block大小是512byte。
(3).wBlk_nor/s:使用write(2)系统调用接口写入的block数,block大小是512byte。
(4).rBlk_dir/s:使用O_DIRECT标志位读取的block数。
(5).wBlk_dir/s:使用O_DIRECT标志位写入的block数。
(6).rBlk_svr/s:NFS客户端通过NFS读请求从服务端读取的block数。
(7).wBlk_svr/s:NFS客户端通过NFS写请求往服务端写入的block数。
(8).rkB_nor/s wkB_nor/s rkB_dir/s wkB_dir/s rkB_svr/s wkB_svr/s rMB_nor/s wMB_nor/s rMB_dir/s wMB_dir/s rMB_svr/s wMB_svr/s,同上,单位不同而已
(9).ops/s:每秒到文件系统的总操作数
(10).rops/s:每秒到文件系统的读操作数
(11).wops/s:每秒到文件系统的写操作数

选项:
-c 显示CPU使用率报告。
-d 显示设备使用率报告。
-h 使-n的NFS报告对人更易读。
-k 使统计数据以KB来表示,而不是扇区。
-m 使统计数据以MB来表示,而不是扇区。
-N 显示注册的设备映射名字,在使用逻辑卷LVM2时很好用。
-n 显示网络文件系统报告
-p [ { device [,…] | ALL } ] 后面接要监测的设备,例如sda
-t 显示时间戳,时间戳的格式受 S_TIME_FORMAT 环境变量影响。
-V 显示版本号然后退出
-x 显示扩展的统计数据,需要/proc/diskstats,挂载的sysfs,/proc/partitions等支持。
-z 如果统计时间内没有活动,iostat就不输出

环境
iostat命令会受以下环境变量影响
S_TIME_FORMAT 如果这个环境变量存在,会影响iostat的时间戳格式,遵循ISO 8601格式

例子
iostat 显示自启动以来的CPU和设备的报告。
iostat -d 2 每2秒间隔持续显示报告
iostat -d 2 6 每2秒间隔持续显示报告,显示6次
iostat -x hda hdb 2 6 为hda和hdb显示报告,每2秒间隔,显示6次
iostat -p sda 2 6 为sda及子分区显示报告,每2秒间隔,显示6次

BUGS
/proc 文件系统必须以挂载,iostat依赖它。扩展的统计数据只对2.5以上的内核可用。
svctm已经没有意义,由于I/O统计是通过block层计算出来的,我们并不知道磁盘驱动器什么时候开始处理一个请求。
因此,下一个版本将删除svctm这项。

文件
/proc/stat 包含系统统计数据
/proc/uptime 包含系统uptime.
/proc/partitions 包含磁盘统计数据,2.5内核支持
/proc/diskstats 包含磁盘统计数据,2.5内核支持
/sys contains 块设备的统计数据 (post 2.5 kernels).
/proc/self/mountstats 包含网络文件系统统计数据


1. 输出CPU和输入/输出(I/O)的统计信息

不带参数的iostat命令将会输出CPU和每个分区的输出/输出的统计信息,如下所示。

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux系统_05


2. 只输出CPU的统计信息

iostat命令的-c参数仅输出CPU的统计信息,如下所示。

[xgj@entel2 ~]$ iostat -c
Linux 3.10.5-3.el6.x86_64 (entel2)  01/19/2017  _x86_64_    (24 CPU)

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.70    0.00    0.54    0.72    0.00   98.03

[xgj@entel2 ~]$ 

3. 只输出磁盘的输入/输出统计信息

iostat命令的-d参数仅输出磁盘的所有分区的输入/输出的统计信息,如下所示。

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux教程_06


4. 只输出某个磁盘的输入/输出统计信息

在默认情况下iostat命令会输出所有分区的统计信息,但是若在iostat命令后加上-p参数和磁盘设备名,该命令将会仅输出列出的磁盘的输入/输出统计信息,如下所示。

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux系统_07


5. 输出逻辑卷管理(LVM)的统计信息

iostat命令的-N(大写)参数将会输出LVM(LVM是linux环境下对磁盘分区进行管理的一种机制,是磁盘分区和文件系统间的一个逻辑层)的统计信息,如下所示。
Linux Performance Monitoring with Vmstat and Iostat Commands_Linux教程_08


6. iostat版本信息

iostat的-V(大写)参数将会输出iostat的版本信息,如下所示。

[xgj@entel2 ~]$ iostat -V
sysstat version 9.0.4
(C) Sebastien Godard (sysstat <at> orange.fr)
[xgj@entel2 ~]$ 

iotop

官网:http://guichaz.free.fr/iotop/

需要用root用户执行

在某些场景下,我们需要找到占用IO特别大的进程,然后关闭它,需要知道PID或者进程名称,这就需要用到iotop。iotop是一个检测Linux系统进程IO的工具,界面类似top,如下图。

Linux Performance Monitoring with Vmstat and Iostat Commands_Linux教程_09

[xgj@entel2 ~]$ iotop
Netlink error: Operation not permitted (1)

The Linux kernel interfaces that iotop relies on now require root privileges
or the NET_ADMIN capability. This change occurred because a security issue
(CVE-2011-2494) was found that allows leakage of sensitive data across user
boundaries. If you require the ability to run iotop as a non-root user, please
configure sudo to allow you to run iotop as root.

Please do not file bugs on iotop about this.
[xgj@entel2 ~]$ sudo iotop

iotop和top一样,也可以通过键入相应键,触发排序选项,例如按o可以在IO活动进程和所有进程之间切换。可以通过左右箭头,选择响应的列进行数据排序。

手册:

名称
iotop - 简单的top类I/O监视器 总览
iotop [OPTIONS] 描述
iotop根据Linux内核(需要2.6.20及以上)来监测I/O,并且能显示当前进程/线程的I/O使用率。
Linux内核build的时候,需要开启CONFIG_TASK_DELAY_ACCT和CONFIG_TASK_IO_ACCOUNTING选项,这些选项依赖于CONFIG_TASKSTATS。
在采样周期里,iotop按列显示每个进程/线程的I/O读写带宽,同时也显示进程/线程做swap交换和等待I/O所占用的百分比。
每一个进程都会显示I/O优先级(class/level),另外在最上面显示每个采样周期内的读写带宽。
使用左右箭头来改变排序,r用来改变排序顺序,o用来触发–only选项,p用来触发–processes选项。
a用来触发–accumulated选项,q用来退出,i用来改变进程或线程的监测优先级,其它任继健是强制刷新。

选项
–version 显示版本号然后退出
-h, –help 显示帮助然后退出
-o, –only 只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
-b, –batch 非交互模式,一般用来记录日志
-n NUM, –iter=NUM 设置监测的次数,默认无限。在非交互模式下很有用
-d SEC, –delay=SEC 设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
-p PID, –pid=PID 指定监测的进程/线程
-u USER, –user=USER 指定监测某个用户产生的I/O
-P, –processes 仅显示进程,默认iotop显示所有线程
-a, –accumulated 显示累积的I/O,而不是带宽
-k, –kilobytes 使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
-t, –time 加上时间戳,非交互非模式。
-q, –quiet 禁止头几行,非交互模式。有三种指定方式。
-q 只在第一次监测时显示列名
-qq 永远不显示列名。
-qqq 永远不显示I/O汇总