暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

探测磁盘IO hang多久的工具iomaxtime

中启乘数 2023-05-26
90

01 Introduction

介绍

在我们测试存储路径切换、软Raid切换时,我们想知道切换过程中IO到底hang了多久,这时就可以使用此工具。此工具的原理是每隔一段时间,向某一个测试的块设备或文件发送一个读IO(或写IO,可以参数控制),然后看这个IO的响应时间是多少,然后每一秒打印一行,打印出最慢的那个IO的时间。如果IO hang住了,每秒打印的IO 时间是会不断地增加,最后增加到多长时间就表示hang了多久。


02 Usage Method

使用方法

使用的一个示例如下:

    • 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
        各个参数说明:

            mode: 可为0或1,0表示发送的探测IO为读IO,1表示发送的探测IO为IO,注意如果设置为1,则会写一些数据到测试块设备或文件去,会破坏原有的数据。

            blocksize: 指定发送的IO大小,可以带单位,如“8k”表示发送8K的IO大小。

            filename: 指定要探测的块设备名或文件名

            sleep_ms_per_io:探测发IO时,每发一个IO,则sleep一段时间,单位为毫秒。如果不指定,则默认为100ms。

           最后一个参数指定IO的类型,不指定默认为O_DIRECT,对于文件还可以指定O_NOATIME。


        使用场景的一个例子:如果我们有一个做镜像的软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了多长时间。


                        03 /Download Path

                        下载路径

                        下载路径为:https://gitee.com/osdba/iomaxtime



                        点击关注中启乘数公众号,了解更多行业资讯


                        扫码添加乘数小助手微信号

                        邀您进入《PostgreSQL修炼之道:从小工到专家》

                        读者技术交流群



                        文章转载自中启乘数,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

                        评论