iostat与iotop

来源:互联网 发布:mac把网页保存为图片 编辑:程序博客网 时间:2024/05/21 20:23
以下实验环境都在我自己笔记本的VirtualBox虚拟机上,如果换到了真实服务器设备,会额外提示。
view source
print?
1[root@roger-lab tmp]# cat /etc/redhat-release
2CentOS release 6.3 (Final)
3[root@roger-lab tmp]# uname -a
4Linux 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
2sysstat-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
02Linux 2.6.32-279.19.1.el6.i686 (roger-lab)      01/26/2013      _i686_  (1 CPU)
03 
04avg-cpu:  %user   %nice %system %iowait  %steal   %idle
05           0.24    0.12    0.75    0.35    0.00   98.54
06 
07Device:            tps   Blk_read/s   Blk_wrtn/s   Blk_read   Blk_wrtn
08sda               1.68        46.58        65.29     462724     648514
09dm-0              8.49        45.66        65.29     453522     648496
10dm-1              0.03         0.24         0.00       2376          0
一般我们需要持续观察IO状况:
01[root@roger-lab tmp]# iostat -x 1
02Linux 2.6.32-279.19.1.el6.i686 (roger-lab)      01/26/2013      _i686_  (1 CPU)
03 
04avg-cpu:  %user   %nice %system %iowait  %steal   %idle
05           0.36    0.18    1.10    0.50    0.00   97.86
06 
07Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
08sda               0.56    10.05    1.29    1.26    71.16    99.61    66.75     0.11   44.78   3.12   0.80
09dm-0              0.00     0.00    1.65   11.30    69.75    99.61    13.08     1.63  125.92   0.62   0.80
10dm-1              0.00     0.00    0.05    0.00     0.37     0.00     8.00     0.00    2.47   1.85   0.01
11 
12avg-cpu:  %user   %nice %system %iowait  %steal   %idle
13           0.00    0.00    0.00    0.00    0.00  100.00
14 
15Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
16sda               0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
17dm-0              0.00     0.00    0.00    0.00     0.00     0.00     0.00     0.00    0.00   0.00   0.00
18dm-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 :

 

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

 

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

 

011.直接执行iostat不接参数,是指系统从启动到现在为止的统计数据。
02 
032.间隔参数代表每次报告的间隔时间,同样第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。
04 
053.iostat创建3种类型报告,cpu使用率,设备使用率,网络文件系统报告。
06 
074.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 
155.设备使用率报告:
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 
396.网络文件系统(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环境
68iostat命令会受以下环境变量影响
69S_TIME_FORMAT 如果这个环境变量存在,会影响iostat的时间戳格式,遵循ISO 8601格式
70 
71例子
72iostat 显示自启动以来的CPU和设备的报告。
73iostat -d 2 每2秒间隔持续显示报告
74iostat -d 2 6 每2秒间隔持续显示报告,显示6次
75iostat -x hda hdb 2 6 为hda和hdb显示报告,每2秒间隔,显示6次
76iostat -p sda 2 6 为sda及子分区显示报告,每2秒间隔,显示6次
77 
78BUGS
79/proc 文件系统必须以挂载,iostat依赖它。扩展的统计数据只对2.5以上的内核可用。
80svctm已经没有意义,由于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作者
92Sebastien Godard (sysstat <at> orange.fr)
93 
94参考
95sar(1), pidstat(1), mpstat(1), vmstat(8)
96 
97http://pagesperso-orange.fr/sebastien.godard/

 

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

 

1[root@roger-lab ~]# dd if=/dev/sda of=/dev/null

在另一个终端执行iostat -x 1,截取其中一段:

 

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

直接执行:

 

01Total 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       placedin the public domain.

 

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

转载:http://kerrigan.sinaapp.com/post-11.html

 

0 0
原创粉丝点击