以下实验环境都在我自己笔记本的VirtualBox虚拟机上,如果换到了真实服务器设备,会额外提示。
view sourceprint?
1
[root@roger-lab tmp]# cat /etc/redhat-release
2
CentOS release 6.3 (Final)
3
[root@roger-lab tmp]# uname -a
4
Linux roger-lab 2.6.32-279.19.1.el6.i686 #1 SMP Wed Dec 19 04:30:58 UTC 2012 i686 i686 i386 GNU/Linux
一,iostat
Linux下最基本的IO监测工具就是iostat了,它属于sysstat这个rpm包。
1
[root@roger-lab tmp]# rpm -qf /usr/bin/iostat
2
sysstat-9.0.4-20.el6.i686
kernel代码:block/genhd.c
iostat代码:http://pagesperso-orange.fr/sebastien.godard/sysstat-10.1.3.tar.gz

kernel代码暂时读不懂,没关系,继续往下。

简单使用方法为:
01
[root@roger-lab tmp]# iostat
02
Linux 2.6.32-279.19.1.el6.i686 (roger-lab)      01/26/2013      _i686_  (1 CPU)
03
04
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
05
           0.24    0.12    0.75    0.35    0.00   98.54
06
07
Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
08
sda               1.68        46.58        65.29     462724     648514
09
dm-0              8.49        45.66        65.29     453522     648496
10
dm-1              0.03         0.24         0.00       2376          0
一般我们需要持续观察IO状况:
01
[root@roger-lab tmp]# iostat -x 1
02
Linux 2.6.32-279.19.1.el6.i686 (roger-lab)      01/26/2013      _i686_  (1 CPU)
03
04
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
05
           0.36    0.18    1.10    0.50    0.00   97.86
06
07
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
08
sda               0.56    10.05    1.29    1.26    71.16    99.61    66.75     0.11   44.78   3.12   0.80
09
dm-0              0.00     0.00    1.65   11.30    69.75    99.61    13.08     1.63  125.92   0.62   0.80
10
dm-1              0.00     0.00    0.05    0.00     0.37     0.00     8.00     0.00    2.47   1.85   0.01
11
12
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
13
           0.00    0.00    0.00    0.00    0.00  100.00
14
15
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
16
sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
17
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
18
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
监测NFS的统计数据 iostat -n 1 :

 

1
Device:     rBlk_nor/s   wBlk_nor/s   rBlk_dir/s   wBlk_dir/s   rBlk_svr/s   wBlk_svr/s     ops/s    rops/s    wops/s
2
1.2.1.2:/v/       0.00        76.65         0.00         0.00         0.00       314.70      4.00      0.00      4.00
 

以下是iostat输出的解释,由man帮助手册翻译过来:

 

01
1.直接执行iostat不接参数,是指系统从启动到现在为止的统计数据。
02
03
2.间隔参数代表每次报告的间隔时间,同样第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。
04
05
3.iostat创建3种类型报告,cpu使用率,设备使用率,网络文件系统报告。
06
07
4.cpu使用率报告:
08
(1).%user:用户态所占用的CPU使用率百分比(应用程序)。
09
(2).%nice:用户态执行nice优先级所占用的CPU使用率百分比。
10
(3).%system:内核态所占用的CPU使用率百分比(内核)
11
(4).%iowait:CPU处于idle状态等待磁盘IO请求所占用的百分比。
12
(5).%steal:当hypervisor服务另一个(虚拟)CPU时,(虚拟)CPU强制等待的时间占比。
13
(6).%idle:没有磁盘请求时,CPU的空闲时间占比。
14
15
5.设备使用率报告:
16
(1).Device:监测的设备或分区名称
17
(2).tps:代表每秒的传输数(transfer),传输数可以是单个的IO请求或合并多个逻辑请求到单个IO请求。
18
(3).Blk_read/s:每秒读取的block数,block相当于扇区的大小,即512字节。旧内核可能不确定。
19
(4).Blk_wrtn/s:每秒写入的block数。
20
(5).Blk_read:总读取的block数。
21
(6).Blk_wrtn:总写入的block数。
22
(7).kB_read/s kB_wrtn/s kB_read kB_wrtn MB_read/s MB_wrtn/s MB_read MB_wrtn: 同上,只是单位不同
23
(8).rrqm/s:每秒合并的读请求数。
24
(9).wrqm/s:每秒合并的写请求数。
25
(10).r/s:每秒读请求数。
26
(11).w/s:每秒写请求数。
27
(12).rsec/s:每秒的读扇区数。
28
(13).wsec/s:每秒的写扇区数。
29
(14).rkB/s:每秒读的kB数。
30
(15).wkB/s:每秒写的kB数。
31
(16).rMB/s:每秒读的MB数。
32
(17).wMB/s:每秒写的MB数。
33
(18).avgrq-sz:平均请求的大小(扇区)。
34
(19).avgqu-sz:平均队列长度。
35
(20).await:IO请求发送给设备和设备执行请求的时间(毫秒)。
36
(21).svctm:设备执行请求的时间(毫秒),此项不准,不可信。
37
(22).%util:I/O请求发送到设备期间,占用CPU时间的百分比。
38
39
6.网络文件系统(NFS)报告
40
显示每个挂载的网络文件系统统计数据
41
(1).Filesystem:挂载的NFS服务器的主机名和目录
42
(2).rBlk_nor/s:使用read(2)系统调用接口读取的block数,block大小是512byte。
43
(3).wBlk_nor/s:使用write(2)系统调用接口写入的block数,block大小是512byte。
44
(4).rBlk_dir/s:使用O_DIRECT标志位读取的block数。
45
(5).wBlk_dir/s:使用O_DIRECT标志位写入的block数。
46
(6).rBlk_svr/s:NFS客户端通过NFS读请求从服务端读取的block数。
47
(7).wBlk_svr/s:NFS客户端通过NFS写请求往服务端写入的block数。
48
(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,同上,单位不同而已
49
(9).ops/s:每秒到文件系统的总操作数
50
(10).rops/s:每秒到文件系统的读操作数
51
(11).wops/s:每秒到文件系统的写操作数
52
53
选项:
54
-c     显示CPU使用率报告。
55
-d     显示设备使用率报告。
56
-h     使-n的NFS报告对人更易读。
57
-k     使统计数据以KB来表示,而不是扇区。
58
-m     使统计数据以MB来表示,而不是扇区。
59
-N     显示注册的设备映射名字,在使用逻辑卷LVM2时很好用。
60
-n     显示网络文件系统报告
61
-p [ { device [,...] | ALL } ] 后面接要监测的设备,例如sda
62
-t     显示时间戳,时间戳的格式受 S_TIME_FORMAT 环境变量影响。
63
-V     显示版本号然后退出
64
-x     显示扩展的统计数据,需要/proc/diskstats,挂载的sysfs,/proc/partitions等支持。
65
-z     如果统计时间内没有活动,iostat就不输出
66
67
环境
68
iostat命令会受以下环境变量影响
69
S_TIME_FORMAT 如果这个环境变量存在,会影响iostat的时间戳格式,遵循ISO 8601格式
70
71
例子
72
iostat 显示自启动以来的CPU和设备的报告。
73
iostat -d 2 每2秒间隔持续显示报告
74
iostat -d 2 6 每2秒间隔持续显示报告,显示6次
75
iostat -x hda hdb 2 6 为hda和hdb显示报告,每2秒间隔,显示6次
76
iostat -p sda 2 6 为sda及子分区显示报告,每2秒间隔,显示6次
77
78
BUGS
79
/proc 文件系统必须以挂载,iostat依赖它。扩展的统计数据只对2.5以上的内核可用。
80
svctm已经没有意义,由于I/O统计是通过block层计算出来的,我们并不知道磁盘驱动器什么时候开始处理一个请求。
81
因此,下一个版本将删除svctm这项。
82
83
文件
84
/proc/stat 包含系统统计数据
85
/proc/uptime 包含系统uptime.
86
/proc/partitions  包含磁盘统计数据,2.5内核支持
87
/proc/diskstats 包含磁盘统计数据,2.5内核支持
88
/sys contains 块设备的统计数据 (post 2.5 kernels).
89
/proc/self/mountstats 包含网络文件系统统计数据
90
91
作者
92
Sebastien Godard (sysstat <at> orange.fr)
93
94
参考
95
sar(1), pidstat(1), mpstat(1), vmstat(8)
96
97
http://pagesperso-orange.fr/sebastien.godard/
 

解读完了iostat的含义,我们来看一个例子,在一个终端执行:

 

1
[root@roger-lab ~]# dd if=/dev/sda of=/dev/null
在另一个终端执行iostat -x 1,截取其中一段:

 

1
avg-cpu:  %user   %nice %system %iowait  %steal   %idle
2
           0.00    0.00   22.83   77.17    0.00    0.00
3
4
Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
5
sda           16409.78     0.00  530.43    0.00 135791.30     0.00   256.00     2.05    3.88   2.04 108.26
6
dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
7
dm-1              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
 

可以看到一些统计数据,现在我们来算算看:

每个请求的大小:avgrq-sz * 512B / 1024 = 128kB

每秒读的数据量:128kB * r/s = 128kB * 530.43 / 1024 = 66MB

每秒读的数据量(另一种算法):rsec/s * 512B / 1024 / 1024 = 66MB

和我们理解的一样~ OK,iostat就先到这。

2.iotop

有时我们希望知道到底哪个进程产生了IO,这个时候就需要iotop这个工具了。
它的输出和top命令类似,简单直观。官网:http://guichaz.free.fr/iotop/
需要Python 2.5(及以上版本)和 Linux kernel 2.6.20(及以上版本),TASK_DELAY_ACCT,CONFIG_TASKSTATS,TASK_IO_ACCOUNTING,CONFIG_VM_EVENT_COUNTERS这些内核选项开启。

 

1
[root@roger-lab ~]# yum -y install iotop
直接执行:

 

01
Total DISK READ: 43.14 M/s | Total DISK WRITE: 0.00 B/s
02
  TID  PRIO  USER     DISK READ  DISK WRITE  SWAPIN     IO>    COMMAND
03
 8275 be/4 root       43.12 M/s    0.00 B/s  0.00 % 84.28 % dd if=/dev/sda of=/dev/null
04
 8281 be/4 root       18.65 K/s    0.00 B/s  0.00 %  3.24 % python /usr/bin/iotop
05
    1 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % init
06
    2 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kthreadd]
07
    3 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
08
    4 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ksoftirqd/0]
09
    5 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [migration/0]
10
    6 rt/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [watchdog/0]
11
    7 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [events/0]
12
    8 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [cgroup]
13
    9 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [khelper]
14
   10 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [netns]
15
   11 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [async/mgr]
16
   12 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [pm]
17
   13 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [sync_supers]
18
   14 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [bdi-default]
19
   15 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kintegrityd/0]
20
   16 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kblockd/0]
21
   17 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpid]
22
   18 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpi_notify]
23
   19 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [kacpi_hotplug]
24
   20 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ata/0]
25
   21 be/4 root        0.00 B/s    0.00 B/s  0.00 %  0.00 % [ata_aux]
26
 

看起来没有什么难度,照例把man翻译一遍:

 

01
名称 
02
       iotop - 简单的top类I/O监视器
03
总览
04
       iotop [OPTIONS]
05
描述
06
       iotop根据Linux内核(需要2.6.20及以上)来监测I/O,并且能显示当前进程/线程的I/O使用率。
07
       Linux内核build的事后哦,需要开启CONFIG_TASK_DELAY_ACCT和CONFIG_TASK_IO_ACCOUNTING选项,这些选项依赖于CONFIG_TASKSTATS。
08
       在采样周期里,iotop按列显示每个进程/线程的I/O读写带宽,同时也显示进程/线程做swap交换和等待I/O所占用的百分比。
09
       每一个进程都会显示I/O优先级(class/level),另外在最上面显示每个采样周期内的读写带宽。
10
       使用左右箭头来改变排序,r用来改变排序顺序,o用来触发--only选项,p用来触发--processes选项。
11
       a用来触发--accumulated选项,q用来退出,i用来改变进程或线程的监测优先级,其它任继健是强制刷新。
12
13
选项
14
       --version 显示版本号然后退出
15
       -h, --help 显示帮助然后退出
16
       -o, --only 只显示正在产生I/O的进程或线程。除了传参,可以在运行过程中按o生效。
17
       -b, --batch 非交互模式,一般用来记录日志
18
       -n NUM, --iter=NUM 设置监测的次数,默认无限。在非交互模式下很有用
19
       -d SEC, --delay=SEC 设置每次监测的间隔,默认1秒,接受非整形数据例如1.1
20
       -p PID, --pid=PID 指定监测的进程/线程
21
       -u USER, --user=USER 指定监测某个用户产生的I/O
22
       -P, --processes 仅显示进程,默认iotop显示所有线程
23
       -a, --accumulated 显示累积的I/O,而不是带宽
24
       -k, --kilobytes 使用kB单位,而不是对人友好的单位。在非交互模式下,脚本编程有用。
25
       -t, --time 加上时间戳,非交互非模式。
26
       -q, --quiet 禁止头几行,非交互模式。有三种指定方式。
27
              -q     只在第一次监测时显示列名
28
              -qq    永远不显示列名。
29
              -qqq   永远不显示I/O汇总。
30
参见
31
       ionice(1), top(1), vmstat(1)
32
作者
33
       iotop was written by Guillaume Chazarain.
34
       This manual page was started by Paul Wise for the Debian project and is
35
       placed in the public domain.
 

 ok,这篇文章就到这里,大家可以和dd配合使用,做做实验看看自己系统的IO状况。