以下实验环境都在我自己笔记本的VirtualBox虚拟机上,如果换到了真实服务器设备,会额外提示。
2 | CentOS release 6.3 (Final) |
4 | Linux roger-lab 2.6.32-279.19.1.el6.i686 |
一,iostat
Linux下最基本的IO监测工具就是iostat了,它属于sysstat这个rpm包。
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代码暂时读不懂,没关系,继续往下。
简单使用方法为:
02 | Linux 2.6.32-279.19.1.el6.i686 (roger-lab) 01/26/2013 _i686_ (1 CPU) |
04 | avg-cpu: %user % nice %system %iowait %steal %idle |
05 | 0.24 0.12 0.75 0.35 0.00 98.54 |
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状况:
02 | Linux 2.6.32-279.19.1.el6.i686 (roger-lab) 01/26/2013 _i686_ (1 CPU) |
04 | avg-cpu: %user % nice %system %iowait %steal %idle |
05 | 0.36 0.18 1.10 0.50 0.00 97.86 |
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 |
12 | avg-cpu: %user % nice %system %iowait %steal %idle |
13 | 0.00 0.00 0.00 0.00 0.00 100.00 |
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不接参数,是指系统从启动到现在为止的统计数据。 |
03 | 2.间隔参数代表每次报告的间隔时间,同样第一条是系统从启动到现在为止的统计数据,后续的每条都是iostat执行间隔时间内的统计数据。 |
05 | 3.iostat创建3种类型报告,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的空闲时间占比。 |
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: 同上,只是单位不同 |
33 | (18).avgrq-sz:平均请求的大小(扇区)。 |
35 | (20).await:IO请求发送给设备和设备执行请求的时间(毫秒)。 |
36 | (21).svctm:设备执行请求的时间(毫秒),此项不准,不可信。 |
37 | (22).%util:I/O请求发送到设备期间,占用CPU时间的百分比。 |
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:每秒到文件系统的写操作数 |
59 | -N 显示注册的设备映射名字,在使用逻辑卷LVM2时很好用。 |
61 | -p [ { device [,...] | ALL } ] 后面接要监测的设备,例如sda |
62 | -t 显示时间戳,时间戳的格式受 S_TIME_FORMAT 环境变量影响。 |
64 | -x 显示扩展的统计数据,需要/proc/diskstats,挂载的sysfs,/proc/partitions等支持。 |
65 | -z 如果统计时间内没有活动,iostat就不输出 |
69 | S_TIME_FORMAT 如果这个环境变量存在,会影响iostat的时间戳格式,遵循ISO 8601格式 |
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次 |
79 | /proc 文件系统必须以挂载,iostat依赖它。扩展的统计数据只对2.5以上的内核可用。 |
80 | svctm已经没有意义,由于I/O统计是通过block层计算出来的,我们并不知道磁盘驱动器什么时候开始处理一个请求。 |
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 包含网络文件系统统计数据 |
92 | Sebastien Godard (sysstat <at> orange.fr) |
95 | sar(1), pidstat(1), mpstat(1), vmstat(8) |
解读完了iostat的含义,我们来看一个例子,在一个终端执行:
在另一个终端执行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 |
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这些内核选项开启。
直接执行:
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] |
看起来没有什么难度,照例把man翻译一遍:
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用来改变进程或线程的监测优先级,其它任继健是强制刷新。 |
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 禁止头几行,非交互模式。有三种指定方式。 |
31 | ionice(1), top (1), vmstat(1) |
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状况。
转载:http://kerrigan.sinaapp.com/post-11.html