以下实验环境都在我自己笔记本的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状况。
iostat与iotop
转载上一篇:mysql 中 时间和日期函数
下一篇:mysql函数大全 整理
提问和评论都可以,用心的回复会被更多人看到
评论
发布评论
相关文章
-
iotop命令性能监测与优化
iotop命令性能监测与优化
iotop命令性能监测与优化