在我们测试存储路径切换、软Raid切换时,我们想知道切换过程中IO到底hang了多久,这时就可以使用此工具。此工具的原理是每隔一段时间,向某一个测试的块设备或文件发送一个读IO(或写IO,可以参数控制),然后看这个IO的响应时间是多少,然后每一秒打印一行,打印出最慢的那个IO的时间。如果IO hang住了,每秒打印的IO 时间是会不断的增加,最后增加到多长时间就表示hang了多久。
使用的一个示例如下:
root@ubuntu03:~# iomaxtime 1 8k /dev/md/mdtest 100
Start to write data test...
Large file is supported,file /dev/md/mdtest size is 20479 Mbytes,blocksize is 8192.
2013-07-03 05:39:27: io time : 3.5172 ms
2013-07-03 05:39:28: io time : 1.8339 ms
2013-07-03 05:39:29: io time : 3.7432 ms
2013-07-03 05:39:30: io time : 3.0489 ms
2013-07-03 05:39:31: io time : 2.6898 ms
2013-07-03 05:39:32: io time : 3.9141 ms
从上面可以看出,上面IO没有hang,原因是最慢的IO的响应时间没有一直增加。如果打印出的时间是下面这种,说明IO hang了:
2013-07-03 05:41:54: io time : 538.1021 ms
2013-07-03 05:41:55: io time : 1538.2941 ms
2013-07-03 05:41:56: io time : 2538.4941 ms
2013-07-03 05:41:57: io time : 3538.6691 ms
不带任何参数运行这个工具,显示出这个工具的帮助:
root@ubuntu03:~# iomaxtime
iomaxtime v0.1
iomaxtime <mode> <blocksize> <filename> [sleep_ms_per_io] [O_SYNC|O_DIRECT|O_NOATIME]
iotype can be combine flags: O_SYNC,O_DIRECT,O_NOATIME
mode:0 - only read test
mode:1 - only write test
Example: iomaxtime 0 8k test.dat 100 O_DIRECT|O_NOATIME
Author: TangCheng
各个参数说明:
使用场景的一个例子: 如果我们有一个做镜像的软Raid,底层的两个设备是由远程的两台机器上输出的iSCSI设备组成,如果这台机器与其中一台提供硬盘的机器网络中断,那么会导致软Raid降级,但降级是有一个过程的,软Raid检测降级的方法是发送到这个底层的IO出错时。如果IO一直没有返回,则软Raid还认为是正常的,这时发到这个软Raid的IO一直会hang,直到软Raid检测到此故障,IO才能恢复正常 。如果我们想获得这个hang的时间是多少,则可以使用我写的这个工具来完成。 测试过程为先建一个从其它两台机器上输过来的iSCSI设备。提供iSCSI设备的两台机器的IP为
192.168.122.11
192.168.122.12
把iSCSI设备挂过来的命令为:
iscsiadm -m discovery -t st -p 192.168.122.11
iscsiadm -m discovery -t st -p 192.168.122.12
iscsiadm -m node -T iqn.2001-04.com.ubuntu02:s02 -l
iscsiadm -m node -T iqn.2001-04.com.ubuntu02:s02 -l
我们使用iSCSI -m 3 -p 3可以看出挂过来的设备为/dev/sda和/dev/sdb,则建软Raid的过程为:
root@ubuntu03:/usr/bin# mdadm --create /dev/md/mdtest --metadata=0.9 --level=1 --raid-devices=2 --assume-clean /dev/sda /dev/sdb
mdadm: /dev/sda appears to be part of a raid array:
level=raid0 devices=0 ctime=Wed Dec 31 19:00:00 1969
mdadm: /dev/sdb appears to be part of a raid array:
level=raid0 devices=0 ctime=Wed Dec 31 19:00:00 1969
Continue creating array? y
mdadm: array /dev/md/mdtest started.
这时运行这个工具,探测IO情况:
root@ubuntu03:~# iomaxtime 1 8k /dev/md/mdtest 100
Start to write data test...
Large file is supported,file /dev/md/mdtest size is 20479 Mbytes,blocksize is 8192.
2013-07-03 05:39:27: io time : 3.5172 ms
2013-07-03 05:39:28: io time : 1.8339 ms
2013-07-03 05:39:29: io time : 3.7432 ms
2013-07-03 05:39:30: io time : 3.0489 ms
2013-07-03 05:39:31: io time : 2.6898 ms
2013-07-03 05:39:32: io time : 3.9141 ms
....
....
从上面可以看到,最慢IO的响应时间是比较均衡的。
我们在另外的一个窗口中使用下面的命令把到192.168.122.12机器的路由改到127.0.0.1,这样就会导致到192.168.122.12的网络中断,这时192.168.122.12提供的iSCSI设备将不能访问:
route add -host 192.168.122.11 gw 127.0.0.1
这时我们再切换回我们刚才运行工具的窗口,看响应时间:
2013-07-03 05:41:54: io time : 538.1021 ms
2013-07-03 05:41:55: io time : 1538.2941 ms
2013-07-03 05:41:56: io time : 2538.4941 ms
2013-07-03 05:41:57: io time : 3538.6691 ms
2013-07-03 05:41:58: io time : 4538.9061 ms
2013-07-03 05:41:59: io time : 5539.0761 ms
2013-07-03 05:42:00: io time : 6539.2680 ms
2013-07-03 05:42:01: io time : 7539.4850 ms
2013-07-03 05:42:02: io time : 8539.8691 ms
2013-07-03 05:42:03: io time : 9540.0560 ms
2013-07-03 05:42:04: io time : 10540.2629 ms
2013-07-03 05:42:05: io time : 11540.4880 ms
....
....
从上面可以看到最慢IO的响应时间一直在增加,说明有IO hang了,一直没有返回,所以每次统计的时候,这个时间就一直增加。直到大约两分钟后:
....
....
2013-07-03 05:44:03: io time : 129609.0541 ms
2013-07-03 05:44:04: io time : 130609.2231 ms
2013-07-03 05:44:05: io time : 130623.7381 ms
2013-07-03 05:44:06: io time : 1.5011 ms
2013-07-03 05:44:07: io time : 1.1470 ms
2013-07-03 05:44:08: io time : 1.2071 ms
....
....
我们从上面可以看出来,这种情况将导致软Raid hang:130623.7381ms也就是将近130秒。这时再检测软Raid的状态,可以看到软Raid已显示出降级了。
root@ubuntu03:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md127 : active raid1 sdb[1] sda[2](F)
20971456 blocks [2/1] [_U]
从上面的例子可以看出使用这个工具可以方便探测出IO hang的情况,以及IO hang了多长时间。
下载路径为: